在Generic中遇到有界通配符问题

San*_*jiv -1 java generics collections

我是Java Generics的新手,我目前正在尝试使用Generic Coding ....最终目标是将旧的非通用遗留代码转换为通用代码...

我已经用IS-A定义了两个类,即一个是其他的子类.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试使用有界通配符创建一个列表.并得到编译器错误.

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
Run Code Online (Sandbox Code Playgroud)

有点困惑.请帮我解决这个错误吗?

san*_*hat 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
Run Code Online (Sandbox Code Playgroud)

编辑:

为了回答你的另一个混乱,它是非法写入上限外卡类型,这里是一个线程解释它为什么.