我是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
有点困惑。请帮我解决这个错误吗?
答案 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()并使用结果。