-1

私はJava Genericsを初めて使用し、現在Generic Codingを試しています....最終的な目標は、古い非ジェネリックレガシーコードを汎用コードに変換することです...

IS-A で 2 つのクラスを定義しました。つまり、一方は他方のサブクラスです。

public class Parent {
    private String name;
    public Parent(String name) {
        super();
        this.name = name;
    }
}

public class Child extends Parent{
    private String address;
    public Child(String name, String address) {
        super(name);
        this.address = address;
    }
}

今、バインドされたワイルドカードを使用してリストを作成しようとしています。コンパイラエラーが発生します。

List<? extends Parent> myList = new ArrayList<Child>(); 
myList.add(new Parent("name")); // compiler-error
myList.add(new Child("name", "address")); // compiler-error
myList.add(new Child("name", "address")); // compiler-error

少し混乱しました。これの何が問題なのか教えてください。

4

2 に答える 2

6

それはあなたが創造したからですArrayList<Child>

同じことを達成する (つまり、Listのすべてのサブクラスを保持できるを作成するParent) には、次のように宣言するだけです。List<Parent> myList = new ArrayList<Parent>();

List<Parent> myList = new ArrayList<Parent>(); --> new ArrayList should have generic type Parent
myList.add(new Parent("name")); // will work
myList.add(new Child("name", "address")); // will work
myList.add(new Child("name", "address")); // will work

編集:

あなたの他の混乱に答えるために、上限のワイルドカードタイプに書き込むことは違法です。これは、その理由を説明するスレッドです。

于 2013-06-30T05:56:46.967 に答える