Java Generics - 这两个方法声明是等价的吗?

时间:2011-04-20 09:22:22

标签: java generics

给定一些课程SomeBaseClass。这两个方法声明是否等效?

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

public void myMethod(<? extends SomeBaseClass> param)

2 个答案:

答案 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>

相关问题