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

时间:2013-06-30 05:55:21

标签: 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;
    }
}

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

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
有点困惑。请帮我解决这个错误吗?

2 个答案:

答案 0 :(得分: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

修改

要回答您的其他疑惑,以Upper bound wild card类型撰写非法, here's is a thread 解释原因。

答案 1 :(得分:0)

这就是编译错误的原因:

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

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

由于我们不知道 myList2 / myList1 的元素类型代表什么,我们无法向其添加对象。 add()方法接受类型为E的参数,即集合的元素类型。当实际类型参数为?时,它代表某种未知类型。我们传递给add的任何参数都必须是这种未知类型的子类型。由于我们不知道它是什么类型,因此我们无法传递任何内容。唯一的例外是null,它是每种类型的成员。

另一方面,给定列表&lt; ? &GT; /列表&LT; ?扩展Parent&gt;,我们只能调用get()并使用结果。