2010-03-01 101 views
3

我正在嘗試使用Java中的泛型,並考慮了此示例。使用非泛型實現覆蓋泛型方法

如果我有ClassA<T>,我可以用引用具體類的子類覆蓋它,例如ClassB extends ClassA<String>,然後在任何ClassA使用T的地方,ClassB可以使用String。

現在,忽視了前面的ClassAClassB,如果我有一個抽象ClassA,其中有一個通用的方法:

public <T> void doSomething(T data); 

有沒有什麼方法可以讓我有一個ClassB與一個具體的類重寫它,類似於前面的例子?我想出了一些可行的方法,即對類和方法進行參數化,但我想知道是否有其他方法。

class ClassA<T> { 
    public void doSomething(T data) {}; 
} 

的原因,我不希望把參數的類,因爲它是唯一一個沒有任何與該類型的方法,而一些子類甚至可能不希望在該方法中做任何事情,所以我如果不打算使用它,則不需要在該類中添加參數。

備註ClassA的所有子類都是匿名類,所以增加了樂趣。

+0

請參閱從@wowest答案從類似的問題 [重載泛型方法在Java中] [1] [1]:http://stackoverflow.com/questions/632033/overriding -java-generic-methods – Saasira 2012-05-26 21:36:40

回答

11

由於type erasure,這樣的:

public <T> void doSomething(T data); 

真正含義:

public void doSomething(Object data); 

所以,不,不存在與更嚴格的參數類型覆蓋的方式。

此外,在此代碼:

class ClassA<T> { 
    public <T> void doSomething(T data) {}; 
} 

在類名的類型參數和方法的類型參數實際上是不同的參數。這就像在更高的範圍內聲明與變量相同名稱的局部變量。您可以在ClassA<String>的實例上調用doSomething(123),因爲第二個T對於該方法是本地的。

+0

感謝您的回答。這在Java中是一個奇怪的特性。如果所有方法類型都限制用戶爲Object,那麼在類級別限制類型的意義何在?無論如何,這對我毫無意義。如果我想要一種方法是通用的,你所說的是是沒有用的,除非在課堂上聲明。 – Beezer 2016-07-18 15:42:03

2

總之,答案是否定的。如果你定義了一個具有泛型參數的方法,那麼它的簽名包含一個泛型,任何「覆蓋」都必須與簽名相匹配(包含泛型)。

總之,這真的是一個貧窮的使用泛型的,因爲你寫的是語義相同

public void doSomething(Object data) {} 

通用的位不買你多少,除非它被用來指示什麼返回值如下:

public <T> T doSomething(T data) {} 

但爲什麼要麻煩?真的有一個調用doSomething()的問題嗎?

+0

男人,當我被打斷時,有人張貼有效的相同答案,我討厭它。 – 2010-03-01 18:23:32