問題タブ [bounded-wildcard]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java Generics:コレクションに間違ったタイプを追加する
誰がこれを説明できますか?
私はこれらのクラスのカップルを持っています:
そして、これはアクションです:
この例はエラーなしでコンパイルされ、出力は次のとおりです。
しかし、どうすれば犬猫のリストに追加できますか?そして、猫はどのように犬にキャストされますか?
私が使用しているのは、Javaバージョン「1.6.0_24」です。OpenJDKランタイム環境(IcedTea6 1.11.1)(6b24-1.11.1-4ubuntu3)
java - JavaGenerics-ワイルドカード
私はJavaを初めて使用し、ジェネリックスの処理方法について誤解していることが明らかな状況に陥りましたが、チュートリアルを読んだり、stackoverflowを検索したりしても、(少なくともこれまでのところ)私が思う以上の明確さは得られませんでした。ワイルドカードを誤用しています。ヘッズアップとして、私はC ++のバックグラウンドを持っているので、それがテンプレートをどのように扱うかは、おそらく私がこれにアプローチした方法を彩っています。
代表的なクラスを使用した継承の基本構造は次のとおりです
それはすべて正しいようです(または少なくとも日食は不平を言っていません)、私がそれらを利用しようとすると問題が発生するようです。私の最初の試みは:
そして、Rawタイプの警告につながりました。だから私は試しました...
しかし、これはエラーにつながります
タイプPacketParser>のメソッドparse(capture#9-of?extends Packet)は、引数(Packet)には適用できません。
この時点で、ジェネリックがどのように機能しているかについて何か誤解していると判断したので、stackoverflowを使用して、間違っている場所を示し、正しい方向に向けることができればと思います。
java - 機能する Java API を定義するときのジェネリック ワイルドカードの正しい使用法は何ですか?
一般的な抽象化 (たとえばIterable<T>
) の演算子として機能する関数型の静的ヘルパー メソッドを作成していますが、いつワイルドカードを使用する必要があるかについて少し混乱しています。次の場合の正しい、最もタイプ セーフで最も単純なメソッド シグネチャは何ですか? またその理由は何ですか?
- プロパティの確認:
public static int size(Iterable<?> source)
対。
public static <T> int size(Iterable<T> source)
- 変換:
public static <T> Iterable<T> take(Iterable<T> source, int count)
対。
public static <T> Iterable<T> take(Iterable<? extends T> source, int count)
- 組み合わせる:
public static boolean elementsEqual(Iterable<?> first, Iterable<?> second)
対。
public static <T> boolean elementsEqual(Iterable<T> first, Iterable<T> second)
対。
public static <T> boolean elementsEqual(Iterable<? extends T> first, Iterable<? extends T> second)
java - Java で共変構造がキャプチャー・オブ・エラーで失敗する
次の Java クラス定義を検討してください。
Cage
s の共変を定義するときAnimal
、Java で次のコードを使用します。
しかし、次のJavaの例...
... 次のエラーでコンパイルに失敗します:
Cage 型のメソッド add(capture#2-of ? extends Animal) は引数に適用できません (Lion)
Tiger
そうしないと、後に追加さanimals = lions
れて実行時に失敗する可能性があるため、これが行われますか?
のサブタイプが 1 つしかない場合にそれを拒否しない特別な (仮想的な) ルールを作成できAnimal
ますか?
( を に置き換えることができることはわかっていますadd
。)T
Animal
java - 最終上限のあるワイルドカード
Class<? extends Integer>
正常にコンパイルされますInteger
が、最終的な型であるため、上限として使用することは意味がありません (何もありませんextend
)。
型パラメーターの上限として final 型を使用しようとすると、コンパイラの警告が表示されます。
型パラメーター T は、最終的な型 Integer によって制限されるべきではありません。最終的な型をさらに拡張することはできません
ワイルドカードの上限として final 型を使用してもまったく問題ないのに、型パラメーターに対して警告がスローされるのはなぜでしょうか? なぜ Java は、ワイルドカードが最終的な上位型によって境界付けられることを許可するのですか?
java - ワイルドカード型の ArrayList 内に要素を追加する
リスト型パラメーターが拡張されたワイルドカードであるリストに要素を追加しようとしています質問
識別は質問のサブクラスです。QUESTION は抽象クラスです。
それは私にこのエラーを与えています
ライン #1Cannot instantiate the type ArrayList<? extends Question>
そして2号線で
なぜそのようなエラーが表示されるのですか?何が原因ですか?どうすれば修正できますか?
java - ジェネリックで型をインスタンス化できません
私はこのクラスを持っています
そして、これを使用してこのクラスから変数を作成しようとしています
そして、それは私にこのエラーを与えています
java - 複数のワイルドカード境界
次のクラスがあるとします。
Either
は、タイプ A または B のいずれかのオブジェクトを 1 つ格納するタイプです get()
。その 1 つのオブジェクトを取得します。
get()
問題は、返される型が だけでなく、A と B の共通のスーパータイプになるように、ジェネリックを使用して のメソッド シグネチャを変更できるかどうかですObject
。たとえば、 anEither<Integer, Long>
はget()
returnを持つことができNumber
、 anEither<Deque<T>, Set<T>>
はget()
returnIterable<T>
またはCollection<T>
を持つことができます。等々。(明らかに、 an にEither<Foo,Foo>
はget()
returnが必要Foo
です)。
これが可能な場合、私が持っていた場合Either<List<A>, List<B>>
、最も具体的な型は何get()
を返すことができますか? raw List
、 wildcard List<?>
、またはまったく別のものですか?
java - SynchronizedCollection()静的ファクトリメソッドの入力パラメータにワイルドカードが含まれていないのはなぜですか?
私は Java チュートリアルを進めていて、理解できないことに出くわしました。Collections Trail では、Wrapper の実装について説明していますが、そこで 2 つの静的ファクトリ メソッドに気付きました。
同期ラッパーが制限付きワイルドカードを使用しないのはなぜですか? つまり、synchronizedCollection の署名が次のようにならないのはなぜですか?
java - 下限のワイルドカードを使用したジェネリック
戻りパラメータはMixer<? super Dog>
、が下限のワイルドカードで定義されている場合にそうです。
を返すMixer<Object>
とコンパイラエラーが発生し、でコンパイラエラーが発生しないのはなぜMixer<Animal>
ですか?