2012-04-16 69 views
2

我試着在一個例子中解釋這個問題。我得到了一個名爲X的接口,並且我得到了一個實現X的類Y.在列表中收集了幾個Y的實例。現在,這是我不明白的一點。 當我試圖將這個列表分配給一個集合時,我得到一個編譯器錯誤。 否則,當我將這個列表分配給它的集合時就起作用了。演員表收藏

List<Y> yList = new ArrayList<Y>(); 
// works 
Collection<? extends X> coll1 = yList; 
// error 
Collection<X> coll2 = yList; 

任何人可以解釋什麼這兩個變種,爲什麼之間的差異,第二個是行不通的。

+3

完全重複:http://stackoverflow.com/questions/8093767/generics-cast-issue – jalopaba 2012-04-16 13:31:12

+0

http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html – 2012-04-16 13:32:03

回答

1

爲此,您需要了解更多泛型概念。

讓我們看看下面的代碼:

List<Integer> ints = new ArrayList<Integer>(); 
ints.add(Integer.valueOf(1)); 
List<Number> numbers = ints;// This does not compile! and you will now see why: 

numbers.add(new Double(2.3d));// This is valid 
Integer i = ints.get(1); // This would be broken then because I expect an Integer but get a Double 

這就是爲什麼你需要投下您List<X>Collection<? extends Y>這意味着集合包含Y延伸對象,但你不知道確切的類型。你知道你可以投到(Y),但是你不知道集合中的實際類型是什麼,因此不允許像add()或addAll()這樣的操作。