答えて
はい。
List<Base>
は、すべてがBase
に由来する異なるものの混合物を含むことができます。 List<? extend Base>
には均質な項目が含まれています(つまり、すべてが特定の未知の型から派生しているという意味で、Base
から派生しています)。
List<? extends Base>
はList<T extends Base>
の基本クラスです。したがって、List<T extends Base>
をList<? extends Base>
とする任意のメソッドに渡すことができます。同じことは、List<Base>
を取るメソッドには当てはまりません。
List<Base> list
は、Base
またはそのサブタイプのいずれかの要素を含むことができます。 JDKクラスといくつかの例:
List<Object> objects = new ArrayList<Object>();
objects.add(new Object()); // adding an Object instance
objects.add("I am a String"); // a String instance is also an Object
objects.add(Integer.valueOf(5)); // an Integer instance is also an Object
しかし、あなたは要素を取得するときObject
が宣言リストのtypeパラメータであるので、あなたは、唯一のObject
クラスの変数に割り当てることができます。
Object first = objects.get(1);
Object second = objects.get(2);
Object third = objects.get(3);
彼らの本当のランタイムクラスはまだObject
、String
とInteger
あるので、あなたはそれらのタイプにそれらをキャストし、そのように彼らと仕事が、正しく行われていない場合、このようなキャストがClassCastException
と、実行時に失敗する可能性がありますすることができ、それはですそのような方法でリストを扱うのは良い考えではありません。あなたがすることができないadd()
任意のオブジェクトを、その中に、唯一null
秒 -
List<? extends Base> list
は、すでにダニエルPrydenさんのコメントで述べたので、実際に、変数の宣言のために指定されていない宣言です。
List<? extends String> list = new ArrayList<? extends String>();
list.add("a String")); // compile error!
しかし、あなたはジェネリックメソッドのパラメータのために、このような有界ワイルドカード表現を使用することができます。追加することはできない<? extend E>
ワイルドカードなしで
List<String> strings = Arrays.asList("a", "b");
List<Object> objects = new ArrayList<Object>();
objects.addAll(strings);
:
boolean addAll(Collection<? extends E> c);
これは、あなたがこのような何かを行うことができますList
自体の例は、その署名これですaddAll()
方法であり、ジェネリック型(配列とは異なる)が共変量ではないため、String
をList
のObject
に変換します。つまり、List<String>
はであり、サブタイプはList<Object>
ではありません。しかし、いずれもString
はObject
です。そのため、限定されたワイルドカードを使用してメソッドパラメータを宣言する必要があります。List<String>
はサブタイプList<? extends Object>
です。
また、境界のあるワイルドカードは、主に汎用メソッドパラメータで指定され、メソッドの戻り値の型や変数宣言では指定されません。
- 1. List <Map <String、String >> vsリスト<Object>
- 2. Java汎用タイプ:List <?数を拡張>とList <Tは数>
- 3. リストを拡張する<T>クラス
- 4. リスト<XElement>をList <XElement.Value>
- 5. これは何を意味するのですかList <Class <?データ型>>を拡張しますか?
- 6. リストを<MyObject>をDictionary <obj.string、List <obj.ID>>
- 7. "foreach" VS "List <T> .Foreach" ... which wins
- 8. Params vs. List <T>、いつparamsキーワードを使用してリストを使用するのですか<t>
- 9. リスト< >辞書の中に< K,List< >>(C#)
- 10. Visual studio 2005:List <T> .First()リストC#の<T> .Last()メソッド?
- 11. ICollection <T> Vsリスト
- 12. HashMap <Class<?>、リスト<Class<?> >>リストのクラスがキーを拡張するよう指定します
- 13. List <Point2D.Double>をリストに変換する<Point>
- 14. Visual Studioの拡張:私はVisualStudioを2017年</p> <p>の拡張子を作ってみる
- 15. <textarea>テーブルフォーマットを拡張して破棄します
- 16. mime-typeの完全なリスト<->ファイル拡張子マッピング
- 17. リストの拡張メソッド<T> AddToFront(Tオブジェクト)の使い方?
- 18. List <Map <String、List <>>> BaseAdapter、Android
- 19. List <SomeParamType>からList <SomeParamType><?>>
- 20. .netの拡張メソッドです。<T>
- 21. foreachなしでリスト<V>をマップ<K, List<V>に変換できますか?
- 22. シングル拡張メソッド<K、IEnumerableを/ IListの/ ICollectionを<V>>
- 23. ArrayList <? Realm内のBaseModelを拡張します
- 24. list a =リストb vsリストa =リストb [:]
- 25. リスト<T>はどのように辞書<K, List<T>で動作しますか?
- 26. LINQ、List <>
- 27. List <>
- 28. List <>
- 29. List <>
- 30. List <>
特に、 'List <?'に 'Base'型のオブジェクトを追加することはできません。 Base> 'を拡張します。 –
@LouisWasserman:それだけでなく、 'List <? 'に*任意の*オブジェクト(' null'を除く)を追加することはできません。 '? 'がどのような型を表しているのかわからないので、Base>を拡張します。 –
@LouisWasserman:要するに、List <? extends Base>は、List <?を取り出すメソッドに渡すことができます。 Base>、List 、List 、またはリストを拡張しますか?では、リスト を使用する理由は何ですか?私も困惑しているのは、List <? Base>とList を拡張しています。 '...'は、BaseまたはBaseから(直接的または間接的に)派生したものです。 –
user113454