2010-06-10 107 views
2

所以我有3個類。Java泛型的問題

Abstract class A 

Class B extends class A 

independent Class C 

在包含main方法的類d,我創建類B的實例的列表

List<B> b = methodCall(); // the method returns a list of instances of class B 

現在類CI有一個方法,是共同的A和B兩者,並且因此我不想複製它。我想有一個方法,作爲輸入類A的一個實例,如下所示:

public void someMethod(List<A> a) 

然而,當我這樣做:

C c = new C(); 
c.someMethod(b); 

我得到一個錯誤,有些法不適用對於參數List<B>,而是期望得到List<A>

有沒有很好的方法來解決這個問題? 非常感謝!

+0

這不是一個問題,繼承,這是一個仿製藥的問題。查看泛型教程。對於這類問題,這是一個很好的參考:http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf – 2010-06-10 18:04:09

+0

你能否包含實際的函數定義和錯誤的副本? – VeeArr 2010-06-10 18:04:59

回答

8

如果您有期待List<A>的方法,以及一類B extends A,並希望通過這種方法List<B>,那麼你應該申報的方法:

public void someMethod(List<? extends A> list) 

這使得列表傳遞給A的列表或擴展B的任何東西。

但請注意,您將無法確定傳入該方法的確切類型?。另外,如果您在兩個類之間有重複的方法,那麼這可能表明某個設計已關閉。

+0

非常感謝!它解決了我的問題。不知道這個選項。 – user247866 2010-06-10 18:10:32

+0

然後繼續並接受答案。 – 2010-06-10 18:14:12

3
public void someMethod(List<? extends A> a){ //... 
+0

那麼,問題不斷得到編輯,所以現在我不知道海報是否嘗試使用泛型或不。 – 2010-06-10 18:06:47

+0

編輯衝突methinks。 – 2010-06-10 18:08:10

1

在您的方法簽名中,您有List<A> a這意味着它只接受類型爲A的對象列表。您需要的是接受Aany subtype of A(或A的一個子類型家族)列表的東西。

你需要的是這樣的:

public void someMethod(List<? extends A> list) { 
    ... 
}