2011-06-27 42 views

回答

3

簡短的回答:不能。

List<ClassB>不是List<ClassA>一個亞型(即使ClassBClassA亞型):

List<ClassA> handlerList; 
List<ClassB> bHandlers = new ArrayList<ClassB>(); 

handlerList = bHandlers; // Type mismatch: cannot convert from 
         // List<ClassB> to List<ClassA> 

如果你有接收類的控制,你也許可以讓它接受List<? extends ClassA>代替:

List<? extends ClassA> handlerList; 
List<ClassB> bHandlers = new ArrayList<ClassB>(); 

handlerList = bHandlers; // Compiles fine. 
+0

他沒有指出類層次結構 – Bohemian

+0

也許閱讀標題?他指出ClassB擴展ClassA – StevenGilligan

+0

其實我沒有,但謝謝指出。稍微更新了答案;-) – aioobe

1

你不行。這就是泛型是阻止

+0

有這個問題的解決方案,並且是通配符?擴展,因爲每個classB對象也是一個classA對象。 – anizzomc

+0

足夠公平 - 我沒有注意到classb擴展類的標題 – Bohemian

0

您可以創建一個List<ClassA>並設置對象ClassB,因爲參考變量的類型爲ClassA,那麼您可以調用您需要調用的方法。

List<ClassA> list = new ArrayList<ClassA>(); 
ClassA object = new ClassB(); 
list.add(object); 
setCustomerHandler(list); 

這會幫助你。

2
setCustomHandler(final List<? extends ClassA> customHandler){ 
    } 

這是簡短的答案,長的答案是:取決於你想在setCustomHandler()做什麼。如果你想從列表中得到,那是行得通的,但如果你想放在列表中,它不會工作。原因是:List<? extends ClassA> customHandler表示customHandler包含ClassA的某些子類型,但是您不知道哪一個可以阻止您訪問add(您不知道列表中的內容)。 如果你想放置在列表中,您需要做的

setCustomHandler(final List<? super ClassA> customHandler){ 
    } 

它說,customHandler包含一些超ClassA的的。這允許你把ClassB,但不允許得到

有效的Java從Bloch和阿諾德Java編程語言解釋deatil所有這些事情。

+0

但是,然後,OP無法將'List '列表傳遞給該方法。 –

+0

爲什麼不呢? 'ClassA'是'ClassA'的一個子類型,不是? – aioobe

0

如果ClassA和ClassB沒有關係,那麼你不能。如果它們處於相同的層次結構中(假設都從ClassC繼承)則放置一個父類引用(ClassC)。

例如:

public ClassC{} 
public ClassA<T extends ClassC> extends ClassC{ 
public void setCustomHandler(final List<T> customHandler) { 
    this.customHandler = customHandler; 
} 

} 
0

我不記得了Java,但我相信這是類似的東西:

創建List<ClassA>和你所有的ClassB的項目添加到它:

List<ClassA> myList = new List<ClassA>(); 
myList.addAll(myListOfOtherItems); 

現在,您可以使用myList調用您的方法,因爲它的類型爲List<ClassA>,但包含擴展ClassA的ClassB項目

0

您面臨的問題是,雖然ClassAClassB有一個特定的關係,List<ClassA>List<ClassB>沒有一個。

您不能指定,而是必須逐個將第一個列表中的元素插入到第二個列表中。

0

你不能。

可以使用通配符?

void setCustomHandler(final List<?> customHandler) 

但你必須以某種方式找出參數化類型。

+0

該解決方案將阻止該方法使用列表中的對象,因爲「get」將返回「Object」,甚至更糟糕......調用者將能夠使用各種列表調用該方法。這個解決方案很糟糕。 – anizzomc

相關問題