给定一些课程SomeBaseClass
。这两个方法声明是否等效?
public <T extends SomeBaseClass> void myMethod(T param)
和
public void myMethod(<? extends SomeBaseClass> param)
答案 0 :(得分:5)
不,这些不等同。第二个甚至不会编译,因为它没有任何意义(为什么你会在这种情况下使用泛型呢?)
答案 1 :(得分:0)
正如其他人所说,? extends SomeBaseClass
不是一种类型,在那里没有意义。但是,您实际上只需将SomeBaseClass
放在那里,因为任何作为SomeBaseClass
子类实例的内容,通过继承,也是SomeBaseClass
的实例。
因此,从调用这些函数的人的角度来看,(因为T
仅使用一次,因此对其他类型没有约束效果),以下两个在功能上是等价的:
public <T extends SomeBaseClass> void myMethod(T param)
和
public void myMethod(SomeBaseClass param)
但请注意,这两个对反射的看法不同。此外,函数内部可能需要泛型类型T
,因此在某些情况下可能需要第一种形式(尽管在这种情况下仍然可以为第二种形式编写包装器)。 / p>