33

ジェネリックについて読んでいましたが、バインドされていないワイルドカードの必要性と、生の型との違いがわかりませんでした。この質問を読みましたが、まだはっきりとわかりませんでした。バインドされていないワイルドカードの Java チュートリアル ページで、次の 2 つのポイントを下回り、最初のポイントを理解できませんでした。

  • Objectクラスで提供される機能を使用して実装できるメソッドを作成している場合。
  • コードが、型パラメーターに依存しないジェネリック クラスのメソッドを使用している場合。たとえば、List.size()またはList.clear(). 実際、Class<?>のほとんどのメソッドはClass<T>に依存しないため、 が頻繁に使用されTます。

誰かが、バインドされていないワイルドカードと素人の言語での生の型の違いを説明できますか?

List<?>との違いはList<Object>?

4

5 に答える 5

43

List<?>との違いList<Object>

主な違いは、最初の行はコンパイルされますが、2 番目の行はコンパイルされないことです。

List<?> list = new ArrayList<String> ();
List<Object> list = new ArrayList<String> ();

ただし、ジェネリック型が何であるかがわからないList<?>ため、そのパラメーター化されたメソッドを使用することはできません。

List<?> list = new ArrayList<String> ();
list.add("aString"); //does not compile - we don't know it is a List<String>
list.clear(); //this is fine, does not depend on the generic parameter type

生の型 (ジェネリックなし) との違いについては、以下のコードは正常にコンパイルおよび実行されます。

List list = new ArrayList<String> ();
list.add("aString");
list.add(10);
于 2013-01-09T16:50:25.163 に答える
5

List<?>の違いは?List<Object>

    List<Object> l1 = new ArrayList();
    List<?> l2 = new ArrayList();
    l1.add("Object");
    //l2.add("Object");   incorrect
    l2.add(null);

null 値のみをList<?>

于 2013-01-09T17:27:29.603 に答える
4

個人的には、ワイルドカードに関する Java チュートリアルのこの追加リンクが役立つことがわかりました。

List<?>と の間に見られる主な違いの 1 つはList、前者はその要素からの読み取りにのみ役立つことであり (実際に を追加したい場合を除きますnull)、後者は (チェックされていない) 任意に型指定されたオブジェクトを予期しない側面で追加することができます。効果。

于 2014-02-10T20:54:47.883 に答える