2017-12-08 5 views
0
List<String> srcList = new ArrayList<>(); 
    srcList.add("a"); 
    srcList.add("b"); 
    srcList.add("c"); 

    List<String> descList = new ArrayList<>(3); 
    descList.add("1"); 
    descList.add("2"); 
    descList.add("3"); 
    // public static <T> void copy(List<? super T> dest, List<? extends T> src) 
    Collections.copy(descList, srcList); 

    for (String item: descList) { 
     System.out.println(item); 
    } 

    List<? super String> listC = new ArrayList<>(); 
    listC.add("A"); 
    listC.add("B"); 
    listC.add("C"); 

    Collections.copy(listC, srcList); 

    for (String item : listC) { System.out.println(item); }// complie error. 

<? super T>は、TまたはTのスーパークラスを意味します。 メソッドCollections.copy()のパラメータdestでは、foreachの作業を修正できます。 カスタムリストオブジェクトlistCがこのリストの項目を取得できない理由Java?コレクションのスーパーTはなぜ正しい仕事をコピーする

+0

ループの 'item'は必ずしも文字列である必要はないからです。また、 'String'のスーパークラスの1つのインスタンスでもあります。 –

答えて

4

List<? super String> listCを宣言することにより、あなたはlistCList<String>、またはList<Object>またはList<CharSequence>、またはStringの他のスーパータイプのListことができることを言っています。 listCList<Object>、またはList<String>以外の何か他のものである場合、その内容は必ずしもStringのではない可能性があるため

は今、ラインfor (String item: listC)は、意味がありません。これは、コンパイラがあなたに伝えているものです。

0

srcListからlistCにすべての要素がコピーされていることが分かりましたので、結果リストのタイプはList<? super String>になります。

for (String item : listC)コンパイラは、タイプ? super StringStringタイプに変換しようとしています。これは許可されていません。したがって、コンパイラのエラーです。両方のリストに同じタイプを使用する必要があります。 @DawoodibnKareemに言及されているように、はList<Object>,List<CharSequence>、他のスーパータイプのリストはStringとなります。異なるタイプのリストは互換性がありません。