2011-04-20 78 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的函数,所以在某些情况下可能需要第一种形式(尽管在这种情况下仍然可以为第二种形式编写包装)。