2016-07-01 1 views
2

に延び、最後の行(list1.addAll(list2);は)のaddAll方法List.addAllを使用してリストを追加するコンパイル時エラー<? BaseClassの>このコードでは別の

コンパイル時エラーを生成する(コレクション<は?キャプチャ#3の?BaseClassのを拡張を拡張>)でタイプリスト<キャプチャ#3?

BaseClassの>(>一覧<キャプチャ#4-の?BaseClassのを拡張)の引数には適用されません拡張し、私はこれが許可された場合には、異なるクラスの同じリストインスタンスに追加することが可能であることを認識しません。しかし、私はこれについて正しい道が何かを知りません。

私のgetList()メソッドはサブクラスBaseClassを返す必要がありますが、その要件を変更することはできません。

私は同じ方法で宣言され、同じ種類のオブジェクトを含むこれらの2つのリストを持っています。もう1つを追加する必要があります。 これについてのご意見はありがとうございます。

BaseClass.java

package main; 

public class BaseClass {} 

Main.java

package main; 

import java.util.ArrayList; 
import java.util.List; 

public class Main { 

    private static List<? extends BaseClass> getList() { 

     return new ArrayList<>(); 
    } 

    public static void main(String[] args) { 

     List<? extends BaseClass> list1 = getList(); 

     List<? extends BaseClass> list2 = getList(); 

     list1.addAll(list2); // Compile-time error: "The method addAll(Collection<? extends capture#3-of ? extends BaseClass>) in the type List<capture#3-of ? extends BaseClass> is not applicable for the arguments (List<capture#4-of ? extends BaseClass>)". 
    } 

} 

答えて

4

あなたは新しいList<BaseClass>を作成し、それに両方のリストを追加することができます。

List<BaseClass> merged = new ArrayList<>(); 
merged.addAll(list1); 
merged.addAll(lise2); 

しかしそれgetListList<BaseClass>を返すことをお勧めします。

2

コンパイラは、クラスが互換性があると判断できません。

例ではリスト1は、タイプ

List<SubSubSubClass> 

の可能性があり、あなたはそれにBaseClassのをマージしようとします。 BaseClassをランダムなサブクラスにキャストすることはできません。 また:

List<? extends BaseClass> list1 

はBaseClassのに基づいているオブジェクトのリストを宣言しますが、以下は同じことをするでしょう:これはそれを保証する

private static List<BaseClass> getList() { 

    return new ArrayList<BaseClass>(); 
} 
public static void main(String[] args) { 

    List<BaseClass> list1 = getList(); 

    List<BaseClass> list2 = getList(); 

    list1.addAll(list2); 
} 

List<BaseClass> list1 

はこれを試してみてくださいリスト項目はすべてBaseClass型またはこの型のサブクラスです。

+2

'List list1'は、' List <? 'のように 'BaseClass'に基づくオブジェクトのリストを宣言するのが良い点です。 extends BaseClass> list1'は拡張します。しかし、 'getList()'の戻り値の型を変更することはできません。なぜなら、他のどこかでそれをオーバーライドし、 'BaseClass'の異なるサブクラスのリストを返さなければならないからです。 – SantiBailors