2012-06-28 28 views
6

我有一個方法有一個類型化的List參數,從另一個(類型)類繼承的一些麻煩。帶有鍵入列表和繼承的方法

讓我們保持它的簡單:

public class B<T> { 
    public void test(List<Integer> i) { 
    } 
} 

在B類有一個無用的通用T,以及測試()希望Integer列表。

現在,如果我做的:

public class A extends B { 
    // don't compile 
    @Override 
    public void test(List<Integer> i) { 
    } 
} 

我得到一個「A型的方法測試(列表)必須覆蓋或實現超方法」的錯誤,這是不應該的。

但是刪除列表的類型工作...雖然它不依賴於類通用。

public class A extends B { 
    // compile 
    @Override 
    public void test(List i) { 

而且還定義下面的無用一般使用類型列表

public class A extends B<String> { 
    // compile 
    @Override 
    public void test(List<Integer> i) { 

所以我無言以對,通用B的應該對試驗()列表的類型沒有影響。有沒有人知道發生了什麼?

感謝

+0

我相信你的答案在於[here](http://stackoverflow.com/a/502770/248082)。 – nobeh

+0

傳統上[大寫V]'Void'用於你不想使用的通用參數。例如,在不返回值的情況下使用java.security.PreivilegedAction'(返回'null' - 它是唯一有效的'Void'引用)。 –

回答

8

您正在擴展B的原始類型,而不是通用類型。原始方法實際上沒有方法test(List<Integer> i),但是方法test(List)

如果您切換到原始類型,所有泛型被替換爲原始數據,無論其類型是否填充。

爲了做正確,做

public class A<T> extends B<T> 

這將使用通用型B<T>,其中包括要覆蓋的方法。

+0

謝謝。因爲我們沒有使用T,所以並不合乎邏輯,但是Java的泛型有一些我們必須處理的設計缺陷。 – PomPom

1

當您刪除使用不使用泛型類(或使用原料),從類方法的所有仿製藥都忘了。

由於這個原因,當你通知第二種情況下的泛型類型,你得到它的工作。

此:

class A extends T { 
} 

看起來就像這樣:

class T { 
    public void test(Object g); 
} 

這是呈現在谷歌2011 IO java的拼圖,你可以看到視頻

class T<G> { 
    public void test(G g); 
} 
在這種情況下

here

+0

真正的問題是我沒有使用G,而是一個具體的類。無論如何,我得到了我的答案 – PomPom

+0

您正在使用原始類。 –