2011-04-20 76 views
2

給定一些類SomeBaseClass。這兩個方法聲明是否等價?Java泛型 - 這兩個方法聲明是否等價?

public <T extends SomeBaseClass> void myMethod(T param) 

public void myMethod(<? extends SomeBaseClass> param) 
+3

-1甚至沒有試圖編譯它。 – Ingo 2011-04-20 09:29:03

+0

我不認爲你可以在那裏做第二件事。可能希望用'List'或者其他東西來包裝它(例如:'List <?extends SomeBaseClass>')。 – 2011-04-20 09:31:35

回答

5

不,這些都不是等價的。第二個不會編譯,因爲它沒有任何意義(爲什麼你會在這種情況下使用泛型?)

+1

Argg !!!應該有使用複製複製粘貼+ ;-) – Udo 2011-04-20 13:08:57

+0

公共空隙檢索(String鍵,類 CLZ)\t \t 公共無效myMethod的(類<?延伸錄製> PARAM) \t \t \t } – Udo 2011-04-20 13:10:35

+0

正確的問題是[這裏](http://stackoverflow.com/questions/5730929/java-generics-are-these-two-method-declarations-equivalent-correct-version) – Udo 2011-04-20 13:16:31

0

正如其他人所說,? extends SomeBaseClass是不是一種類型,並沒有什麼意義。但是,您真的可以在那裏放置SomeBaseClass,因爲任何作爲SomeBaseClass的子類的實例的繼承都是SomeBaseClass的實例。

所以,從某人調用這些函數的角度看,(因爲T僅使用一次,並且因此具有對其他類型的無約束作用),下面的兩個在功能上是等效的:

public <T extends SomeBaseClass> void myMethod(T param) 

public void myMethod(SomeBaseClass param) 

但是,請注意,這兩個將出現不同於反射。另外,函數內部可能有一些需要用於泛型T的函數,所以在某些情況下可能需要第一種形式(儘管在這種情況下仍然可以爲第二種形式編寫包裝)。