【问题标题】:Why can't raw types have methods with generic return types [duplicate]为什么原始类型不能具有具有通用返回类型的方法[重复]
【发布时间】:2018-12-06 15:32:38
【问题描述】:

考虑下面的类

class Foo<T> {
    List<String> bar() { return null; }
}

如果我制作这样的原始实例:

final Foo foo = new Foo();

我仍然希望foo.bar() 返回List&lt;String&gt;。因为bar 的签名独立于T。但是,如果我这样做:

final List<String> strings = foo.bar();

我得到一个未经检查的任务

未经检查的分配:“java.util.List”到“java.util.List”。原因:'foo' 是原始类型,所以 bar 的结果被删除了。

我知道上面写着foo被擦除了,但是为什么foo的擦除也会把List&lt;String&gt;擦除到List呢?

目前我正在使用@SuppressWarnings("unchecked") 压制此警告,因为这对我来说似乎毫无意义。

【问题讨论】:

  • 欢迎使用 Java 泛型。
  • 不要称其为“无类型/已擦除”。每个人都知道的词是 raw 类型 ;-) ... 发明自己的话只会让读者感到困惑。是的,本质上,答案是:不要使用原始类型。
  • 谢谢,我忘了怎么称呼它,现在相应地编辑了问题。也感谢您将第二个链接添加到已经回答的块
  • 哈哈 :) Felk,我比你早一个小时发了similar question

标签: java generics java-8


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    只需正确使用泛型,不要使用原始类型。

    【讨论】:

    • ""rare" types" 是故意的错字吗?
    • @MarkRotteveel 否。它指的是部分原始类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多