2012-01-08 63 views
2

我不明白這一點。在java中我被允許申報一個接口作爲方法的返回類型,如:爲什麼一個方法的這個通用返回類型是無效

public List<String> get(){ 
    return new ArrayList<String>(); 
} 

如果我現在有一個接口可以說I和類C實現它,爲什麼我不能這樣定義:

public List<I> get(){ 
    return new ArrayList<C>(); 
} 

我知道的解決方案來創建一個ArrayList<I>並添加C它,但我不知道爲什麼我不能宣佈它像上面的一個。我想,每一個C也是I雖然它應該是沒有問題的。

回答

10

你不能這樣做,因爲List<I>List<C>是不兼容的類型。

你可以這樣做,但是

public List<? extends I> get(){ 
    return new ArrayList<C>(); 
} 
+0

打我吧! 1+ – 2012-01-08 16:06:33

4

您正在運行與合作和逆變的問題。簡而言之:你的List<I>接口也有一個方法Add,該方法預計I的一個實例,但不是每個I實際上都將由C實現,因爲任何其他類也可以實現I。因此,你會類型轉換問題告終。

相關問題