为什么不能,例如List <childclass>是否被传递给一个以List <parentclass>作为参数的方法?</parentclass> </childclass>

时间:2010-01-25 15:15:08

标签: java generics

简单示例:

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)”上发出错误(必需列表&lt; Person&gt;找到List&lt; VIP&gt;)。

这是否意味着虽然VIP是一个人,但列表&lt; VIP&gt;不是List&lt; Person&gt;?

3 个答案:

答案 0 :(得分:11)

没错。香蕉列表水果列表。否则,您可以在香蕉列表中插入任何水果。 e.g。

List<Fruit> lf = new List<Banana>();
lf.add(new Apple());

会导致意外或违反直觉的结果。

答案 1 :(得分:9)

你被Generics的规则所禁止。如果您对如何“修复”此行为感兴趣,只需更改printNames()方法即可获取List<? extends Person>参数。

答案 2 :(得分:1)

C ++的发明者Bjarne Stroustrup解释得很好:

http://www2.research.att.com/~bs/bs_faq2.html#conversion

是的,我知道我参加这个派对已经迟到了,但是比从来没有好,对吧..