为什么不能将例如List <ChildClass>传递给以List <ParentClass>作为参数的方法?

Knu*_*daa 4 java generics

简单的例子:

public class Person
{
    String name;
}

public class VIP extends Person
{
    String title;
}
Run Code Online (Sandbox Code Playgroud)

然后做:

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

在"printNames(vipList)"上给出错误(必需的List <Person> found List <VIP>).

这是否意味着虽然VIP是Person,但List <VIP>不是List <Person>?

Bri*_*new 11

那就对了.香蕉清单不是水果清单.否则你可以在香蕉列表中插入任何水果.例如

List<Fruit> lf = new List<Banana>();
lf.add(new Apple());
Run Code Online (Sandbox Code Playgroud)

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


Bal*_*usC 9

你只是被泛型规则所禁止.如果您对如何"修复"此行为感兴趣,只需更改printNames()方法以取代List<? extends Person>参数.