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

标签 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)”(需要 List 找到 List)上给出错误。

这是否意味着尽管 VIP 是 Person,但 List 不是 List

最佳答案

没错。香蕉列表不是水果列表。否则,您可以在香蕉列表中插入任何 水果。例如

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

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

关于java - 为什么不能,例如将 List<ChildClass> 传递给以 List<ParentClass> 作为参数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2133192/

相关文章:

java - 为什么 Java 不能从 InputStream 正确地重新创建该图像?

java - 在不同 session 中恢复删除集合

java - 在Java中实现多重继承

c# - 我可以将此方法变成通用方法吗?

java - 计算整数数组元素的平方根时的 Arrays.asList 问题

java - 将子类类型(整数/字符串)插入到ArrayList中的父类(super class)类型(对象)中

java - 如何通过.class获取泛型类型?

java - 指定 before/after::operator 的通用方法引用类型

c# - 是否可以构造一个泛型方法以便 T 是可选的?

java - BufferUtils 和 MemoryUtil 有什么区别? (LWJGL)