考虑以下课程
class Foo<T> {
List<String> bar() { return null; }
}
如果我创建这样的原始实例:
final Foo foo = new Foo();
我仍然希望foo.bar()
返回List<String>
。因为bar
的签名独立于T
。但是,如果我这样做:
final List<String> strings = foo.bar();
我收到未选中的作业
未经检查的分配:从“ java.util.List”到“ java.util.List”。原因:'foo'具有原始类型,因此bar的结果被删除。
我知道它说foo
被删除了,但是为什么擦除foo
也会把List<String>
擦除到List
?
当前,我用@SuppressWarnings("unchecked")
禁止显示此警告,因为对我而言似乎毫无意义。
答案 0 :(得分:1)
如其他答案所述,使用“原始”类会丢失所有所有泛型,而不仅仅是类定义的泛型。一种解决方法是只使用通配符,然后它不关心类型而是保留泛型:
final Foo<?> foo = new Foo<>();
答案 1 :(得分:0)
“稀有”类型的规范已经太复杂了。在毫无意义的情况下增加额外的复杂性是没有意义的。
只需正确使用没有原始类型的泛型即可。