首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能将List<ChildClass>传递给以List<ParentClass>为参数的方法?

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

Stack Overflow用户
提问于 2010-01-25 23:15:08
回答 3查看 202关注 0票数 4

简单的例子:

代码语言:javascript
复制
public class Person
{
    String name;
}

public class VIP extends Person
{
    String title;
}

然后执行以下操作:

代码语言:javascript
复制
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是一个人,但名单不是名单

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-25 23:21:21

你只是被Generics的规则禁止了。如果您对如何“修复”此行为非常感兴趣,只需将printNames()方法改为接受List<? extends Person>参数即可。

票数 9
EN

Stack Overflow用户

发布于 2010-01-25 23:17:21

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

代码语言:javascript
复制
List<Fruit> lf = new List<Banana>();
lf.add(new Apple());

会导致意想不到的或违反直觉的结果。

票数 11
EN

Stack Overflow用户

发布于 2010-01-26 00:08:45

C++的发明者Bjarne Stroustrup很好地解释了这一点:

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

是的,我知道我来晚了,但总比不来强,对吧..

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2133192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档