为什么原始类型不能具有带有通用返回类型的方法

时间:2018-12-06 15:32:39

标签: java generics java-8

考虑以下课程

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")禁止显示此警告,因为对我而言似乎毫无意义。

2 个答案:

答案 0 :(得分:1)

如其他答案所述,使用“原始”类会丢失所有所有泛型,而不仅仅是类定义的泛型。一种解决方法是只使用通配符,然后它不关心类型而是保留泛型:

final Foo<?> foo = new Foo<>();

答案 1 :(得分:0)

“稀有”类型的规范已经太复杂了。在毫无意义的情况下增加额外的复杂性是没有意义的。

只需正确使用没有原始类型的泛型即可。