2014-11-06 44 views
0

我想了解Java泛型,我對有界通配符感到困惑。我正在使用Guidelines for Wildcard Use的層次結構,並添加了從EvenNumber繼承的PositiveEvenNumber類。列表中列出的Java通用通配符

List<? super EvenNumber> xn = new ArrayList<NaturalNumber>(); 
    xn.add(new NaturalNumber(35)); // compile-time error 
    xn.add(new EvenNumber(-70)); 
    xn.add(new PositiveEvenNumber(70)); 
    xn.add(new Object()); // compile-time error 

爲什麼第一行會被編譯?在第二行,不是NaturalNumber是EvenNumber的父親,爲什麼不能添加它?

謝謝!

回答

2

A List<? super EvenNumber>是一些特定類型的列表,只要該類型是超類型EvenNumber

因此,它可能是List<EvenNumber>,在這種情況下您不能添加NaturalNumber

這也意味着你無法讀取從列表中任何東西(除Object),因爲你不知道什麼類型的列表中實際上包含。 (它甚至可以是一個List<Object>

+0

感謝您的回答,但自然數是EvenNumber的超類型。爲什麼它不會停在那裏(再加上它是用ArrayList 實例化的)? – Anisotrop 2014-11-06 14:50:55

+0

@Fram:因爲它也可以是'List '本身,而'NaturalNumber'不是。而且,將它分配給的表達式對變量的(編譯時)類型沒有影響。如果你想要一個'List ',你應該聲明一個'List '。 – SLaks 2014-11-06 14:53:12