简单的例子:
public class Person
{
String name;
}
public class VIP extends Person
{
String title;
}然后执行以下操作:
public static void main(String[] args)
{
Person p = new Person();
p.name = "John";
VIP vip = new VIP();
vip.name = "Bob";
vip.title = "CEO";
List<Person> personList = new ArrayList<Person>();
List<VIP> vipList = new ArrayList<VIP>();
personList.add(p);
personList.add(vip);
vipList.add(vip);
printNames(personList);
printNames(vipList);
}
public static void printNames(List<Person> persons)
{
for (Person p : persons)
System.out.println(p.name);
}在"printNames(vipList)“(所需列表已找到列表)上显示错误。
这是否意味着,虽然VIP是一个人,但名单不是名单
发布于 2010-01-25 23:21:21
你只是被Generics的规则禁止了。如果您对如何“修复”此行为非常感兴趣,只需将printNames()方法改为接受List<? extends Person>参数即可。
发布于 2010-01-25 23:17:21
没错。香蕉的清单不是水果的清单。否则,您可以在香蕉列表中插入任何水果。例如:
List<Fruit> lf = new List<Banana>();
lf.add(new Apple());会导致意想不到的或违反直觉的结果。
发布于 2010-01-26 00:08:45
C++的发明者Bjarne Stroustrup很好地解释了这一点:
http://www2.research.att.com/~bs/bs_faq2.html#conversion
是的,我知道我来晚了,但总比不来强,对吧..
https://stackoverflow.com/questions/2133192
复制相似问题