問題タブ [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 ジェネリック (ワイルドカード)
Java の一般的なワイルドカードについていくつか質問があります。
List<? extends T>
とはどう違いList<? super T>
ますか?制限付きワイルドカードと制限なしワイルドカードとは?
java - ワイルドカードを使用した Java のジェネリック
Java の Generics、つまりワイルドカードの使用について質問があります。次のようなクラス GenClass の例があります。
私は別の単純なクラスを持っています:
次のテストクラスを作成しました。
ここで、ワイルドカードを使用してテスト クラスに次のように記述します。
の場所に:
コンパイラはこの新しいステートメントに問題はありませんが、
「メソッド(setVar())は引数(ExampleClass)には適用されません」と書かれています。このメッセージが表示されるのはなぜですか?
私がワイルドカードを使用した方法では、参照変数 c が GenClass 型になり、パラメーターとして任意のクラスを受け入れるようになると思いました-EI の代わりに任意のクラスがあります。これは単なる変数の宣言です。次に、それを初期化します
これは、タイプ ExampleClass のクラスをパラメータとして持つ、タイプ GenClass のオブジェクトを作成することを意味します。したがって、GenClass の E は ExampleClass になり、メソッド setVar() を使用して、引数として ExampleClass 型の何かを与えることができると思います。これは私の仮定と理解でしたが、Java はそれを好まないようで、正しくありません。どんなコメントでも大歓迎です、ありがとう。
java - この Java ジェネリック ワイルドカード エラーを修正するにはどうすればよいですか?
この質問では、TofuBeer は一般化された .xml の作成に問題がありましたIterableEnumeration
。
答えは、問題をほぼ解決したこのリンクhttp://www.javaspecialists.eu/archive/Issue107.htmlを指している jcrossley3 から来ました。
まだ一つ腑に落ちないことがあります。エリクソンが効果的に指摘したように、本当の問題は次のとおりです。
パラメーター化された型を構築するときにワイルドカードを指定することはできません
ただし、宣言でワイルドカードを削除しても機能しませんでした。
次のエラーが発生します。
しかし、JavaSpecialist のサンプルは機能します。
私が見つけることができる唯一の違いは、JavaSpecialists ブログでは、署名が次Enumeration
の から来ていることです。Vector
失敗したものはZipFile
、署名が次のとおりです。
最後に、これはすべて for-each コンストラクトとリンクで提案されている static make メソッドによって吸収されます
しかし!!そのニュースレターのポイントは、この問題を解決することではなく、ジェネリック型を指定する必要性を回避することでした。構文が見苦しいからです!!
だから..私の質問は:
何が起こっている?
IterableEnumeration
パラメータEnumeration
の型が である場合、なぜインスタンスを作成しないの<? extends SomeClass>
ですか そして、make for-each 構造が問題を飲み込むのはなぜですか?!!!
なぜこれが機能するのですか:
しかし、これはうまくいきませんか?
以下は、TofuBeer の元のコードの (わずかに) 変更されたバージョンです。
理解したい!!
java - クラスとインターフェースを備えた Java ジェネリック - Together
Class オブジェクトが必要ですが、それが表すクラスが何であれ、強制的にクラス A を拡張し、インターフェイス B を実装したいと考えています。
できます:
または:
しかし、私は両方を行うことはできません。これを行う方法はありますか?
java - リスト
ジェネリックについて Java の質問があります。一般的なリストを宣言しました:
次に、いくつかの方法で、インスタンス化してそのリストに項目を追加しようとします。
myTypeInstance
はタイプのオブジェクトですMyType
。コンパイルされません。それは言います:
List<capture#3-of ? 型の add(capture#3-of ? extends MyType) メソッド extends MyType> は引数 (MyType) には適用されません
何か案が?
java - ワイルドカードを使用した Java ジェネリック
この状況を修正する方法はあります (可能な限りシナリオを単純化しようとしました):
このシナリオは私に次のエラーを与えています:
ジェネリックでこれを行う方法があるかどうかはわかりませんが、
java - 戻り値の型で推測されるワイルドカード ジェネリック
Java は、多くの場合、引数に基づいてジェネリックを推論できます (たとえば、C# とは対照的に、戻り値の型に基づいても)。
Pair<T1, T2>
適切な例: 値のペアを格納するだけで、次の方法で使用できるジェネリック クラスがあります。
メソッドof
は次のようになります。
非常に素晴らしい。ただし、これは、ワイルドカードが必要な次のユースケースでは機能しなくなりました。
List.class
(正しい型を作成するための明示的なキャストに注意してください。)
コードは次のエラーで失敗します (Eclipse によって提供されます)。
TestClass.Pair<Class<capture#1-of ?>,String>
型の不一致: からに変換できませんTestClass.Pair<Class<?>,String>
ただし、コンストラクターを明示的に呼び出すと、期待どおりに機能します。
誰かがこの振る舞いを説明できますか? それは設計によるものですか?欲しいですか?私は何か間違ったことをしていますか、それとも設計上の欠陥やコンパイラのバグに遭遇しましたか?
勝手な推測: 「capture#1-of ?」どういうわけか、ワイルドカードがコンパイラによってオンザフライで埋められ、型が aClass<List>
になり、変換が失敗することを暗示しているようです (からPair<Class<?>, String>
へPair<Class<List>, String>
)。これは正しいですか?これを回避する方法はありますか?
Pair
完全を期すために、クラスの簡略化されたバージョンを次に示します。
java - JavaGenericsの好奇心
A
クラスB
が実装するインターフェースがあります。
次の一般的な方法が機能します
しかし
私が出力をに向けているとき、しません(コンパイルエラー、タイプの不一致)
defaultCollectionFactory(int count)
B
デフォルトのラベル付けスキームを使用して、sのコレクションを静的に提供します。
それがなぜであるかについての洞察はありますか?一般的なUとワイルドカードは同じことをしているようです。
java - Collections.sort() を使用してジェネリック List をソートするための Comparator オブジェクトを作成する
MyInterface を実装する任意のクラスのオブジェクトのリストに対して、一般的な並べ替えユーティリティ メソッドを実装しようとしています。Java API ( http://java.sun.com/javase/6/docs/api/java/util/Collections.html ) ごとに、Collections.sort() メソッドのシグネチャは次のとおりです。
ワイルドカード パラメーターを使用したリストが「プレーンな」パラメーター化されたリストを置き換えることができるかどうかはわかりませんが、次のことを試しました。
コンパイル時エラーが発生し、
だから、私はそれを次のように変更しました:
そして、コンパイルして動作します。良い説明はありますか?