簡體   English   中英

為什么不能例如List <ChildClass> 傳遞給一個接受List的方法 <ParentClass> 作為參數?

[英]Why can't e.g. List<ChildClass> be passed to a method that takes a List<ParentClass> as parameter?

簡單的例子:

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 <Person> found List <VIP>)。

這是否意味着雖然VIP是Person,但List <VIP>不是List <Person>?

那就對了。 香蕉清單不是水果清單。 否則你可以在香蕉列表中插入任何水果。 例如

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

會導致意外或違反直覺的結果。

你只是被泛型規則所禁止。 如果您對如何“修復”此行為感興趣,只需更改printNames()方法以獲取List<? extends Person> 改為List<? extends Person>參數。

C ++的發明者Bjarne Stroustrup解釋得很好:

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

是的,我知道我參加這個派對已經遲到了,但總比沒有好,對吧..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM