假设你有一些类T
类型:Java泛型 - 何时?通配符需要
class MyClass<T extends SomeOtherClass> {
....
}
现在,你想这个类的实例存储到一个集合,但你并不真正关心的类型。我会表达如下:
private final List<MyClass> entries = new ArrayList<>();
是否有任何好的理由/优势写下列代替?
private final List<MyClass<?>> entries = new ArrayList<>();
甚至:
private final List<MyClass<? extends SomeOtherClass> entries = new ArrayList<>();
我自己只能找到一个不好的理由这样做:每当MyClass
变化(例如添加另一种类型)类型定义,你必须改变全局代码中的List<MyClass<?>>
或List<MyClass<? extends SomeOtherClass>>
定义也是如此。
更新
要更新我的问题:
为什么不是编译器能够跟踪的MyClass
的类型,当你写List<MyClass>
(甚至List<MyClass<? extends SomeOtherClass>>
)?他知道MyClass
被定义为MyClass<T extends SomeOtherClass>
,那么当你写List<MyClass>
时,他为什么不能这样做呢?
换句话说,为什么List<MyClass>
不等于List<MyClass<?>>
(或甚至List<MyClass<? extends SomeOtherClass>>
)?编译器拥有所有的信息来自己做出这个结论,afaik。
看看这个伟大的答案:http://stackoverflow.com/a/3009779/2215166 – christophetd
http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why -shouldnt-we-use-it潜在相关。还有'?扩展SomeOtherClass'当然是有用的,因为它提供了有关类不兼容的编译时错误,如果你真的只想要实现特定接口的泛型,就可以节省许多麻烦。 – CollinD
[Java泛型中的问号的类型参数是什么意思?]的可能重复(http://stackoverflow.com/questions/3009745/what-does-the-question-mark-in-java-generics-type-参数平均) – Joe