問題タブ [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 - ジェネリック メソッドとワイルドカード
次の 3 つの署名の違いは何ですか?
私はジェネリックで何extends
を意味するかを知っています。私の質問は、とsuper
の間に違いがあるかどうかです。パラメータの 1 つを不変にし、他の 1 つを適切な方向に変更する必要がありますか、それとも両方を変更する必要がありますか? 違いはありますか?foo
bar
baz
java - (Java)バインドされたワイルドカードジェネリックを使用してインターフェイスメソッドを実装する方法は?
私は同じ機能を持つ 2 つのプロジェクトを維持しており、この機能をコモンズ プロジェクトに統合しています。インターフェイスを定義しました:
このインターフェイスを両方のプロジェクトに実装します。
Shape
のサブタイプですShapeData
。このクラスをコンパイルすると、このコンパイル エラーを解決するにはどうすればよいですか?List<Shape>
へのキャストに関するエラーが表示されます。List<? of...
たぶんもっと良い質問は、バインドされたワイルドカード (つまり ? extends) を使用してインターフェイス メソッドを定義する必要があるかということです。
java - Java ジェネリクス: 制限付き型パラメーターでの複数の継承
特定のクラス A と別のインターフェイス I を拡張する特定の型 T のオブジェクトを作成するファクトリを作成しようとしています。ただし、T を認識してはなりません。最低限の宣言は次のとおりです。
これはファクトリメソッドです:
これはすべてうまくコンパイルされます。
メソッドを使用しようとすると、次のように動作します。
...これはそうではありませんが:
コンパイラは不平を言います:
範囲の不一致: 型 F のジェネリック メソッド newThing() は、引数 () には適用できません。推定されたタイプ I&A は、制限付きパラメーターの有効な代替ではありません
理由がわかりません。「newThing は、クラス A を拡張し、インターフェース I を実装する特定の型 T のものを返す」と明確に述べられています。A に代入するとすべてが機能します (T は A を拡張するため) が、I に代入すると機能しません (何が原因で、返されるものは明らかにAとI の両方です)
また、オブジェクトを返すとき、たとえば B の型class B extends A implements I
を返す場合、 B は境界に一致しますが、戻り値の型 T にキャストする必要があります。
ただし、コンパイラは UncheckedCast などの警告をスローしません。
したがって、私の質問:
- ここで何がうまくいかないのですか?
- ファクトリメソッドでキャストによって戻り型の問題を解決する場合のように、目的の動作 (つまり、静的型 A または I の変数への割り当て) を達成する簡単な方法はありますか?
- A への割り当てが機能するのに、I への割り当てが機能しないのはなぜですか?
--
編集:ここでは、Eclipse 3.7 を使用して完全に機能する完全なコード スニペット、JDK 6 用に設定されたプロジェクト:
編集:実行時に機能するメソッドと呼び出しの完全な例を次に示します。
java - タイプ 安全警告
Maurice Naftalin、Philip Wadler による本 Java Generics and Collections で、私は Generics の制限を経験していて、疑問に思いました。それは本で答えられているかもしれませんが、私はかなり混乱していると思います.
次のコードでは:
本で述べられているように、ネストされたワイルドカードのインスタンス化は問題ありません。最初の list では、リスト型のオブジェクトが含まれることがわかっているからです。
しかし、上記のコードを変更しようとしたところ、1 つの警告と 1 つのコンパイル時エラーが発生しました。私はやろうとしました:
私の質問は次のとおりです。1)最初の行に次のように書いた場合:
ここでは警告は発行されませんが、前のブロックに書かれているように、次のように書いた場合:
警告が発行されます。なんで?
2) 4 行目にコンパイル時エラーがあるのはなぜですか。
前もって感謝します。
java - 汎用スタックの配列での JAVA ワイルドカード キャプチャ エラー
これが、スタックの配列を作成するコードです。それらを配列に入れる理由は、それが課題の要件の 1 つだからです。プログラムは配列なしで動作します。
また、独自のスタックを作成する必要があったため、スタックはジェネリックを取り込みます (課題の要件でもあります)。
このコードは、テキスト ファイルから情報を取得し、オブジェクトをスタックにプッシュします。
次のようなエラーが表示されます。
このエラーは、作成したすべてのクラスで繰り返されます。
コメントアウトされた部分は、各オブジェクトに対して単一のスタックを作成したときに以前に機能したコードです。
すべてをスタックにプッシュした後、すべてを配列に入れることはできません。これは、不要な中間変数に対してポイントが取り出されるためです。
java - ジェネリッククラスとメソッドの宣言でワイルドカードを使用できないのはなぜですか?
このような宣言:
は許可されていますが、このような宣言は許可されていません。
Java がそれを制限する理由について論理的な説明はありますか?
&実際の違いは何ですか
java - さまざまな抽象化のジェネリックパラメーターを受け入れる単一のメソッドを作成することは可能ですか?
この質問のフォローアップとしてDog
、適切な部屋にを追加する単一のメソッドを作成することは可能ですか?Animal
(この例では、部屋または部屋のいずれかを受け入れますDog
。)または、次のように2つの異なるメソッドを作成する必要がありますか?(型消去のためにオーバーロードに頼ることさえできません)。
java - キャストせずにワイルドカードを使用してジェネリックを関数に渡す方法は?
ここに私の問題があります:クラスAの私の関数:
私の電話:
これはきれいではないと思います。関数でワイルドカードの使用を削除せずにキャストを回避する方法はありますか?
java - ジェネリック ワイルドカードの適切な使用
次のように定義されたオブジェクトがあります。
ワイルドカードに準拠しているように見えるオブジェクトを挿入しようとしています
コンパイラは、次のようなエラーをスローします。
型のメソッド
put(String, capture#18-of ? extends List<? extends LightGeometry>
)Map<String,capture#18-of ? extends List<? extends LightGeometry>>
は引数に適用できません(String, ArrayList<LightGeometry>)
私は何が欠けていますか?
編集: ジェネリック型でワイルドカードを使用する理由geoms
基本的には、リストをふるいにかけてキャストすることなく、別のクラスに
あるオブジェクトにリスト (サービスを介して取得) を割り当てることができるようになります。 .
geoms
変数を aにすると、 a を 'Map>` にMap<String, List<LightGeometry>>
代入できないというキャスト エラーが発生します。Map<String,ArrayList<LightPolygon>>