【问题标题】:Why `T extends String` is allowed but gives warning? [duplicate]为什么允许`T extends String`但给出警告? [复制]
【发布时间】:2012-09-18 10:22:38
【问题描述】:

可能重复:
@SuppressWarnings for “extends String”

为什么T extends String 被允许但给出警告?

类型参数 T 不应以最终类型 String 为界。最终类型无法进一步扩展

public class Car<T extends String> 

我知道什么是最终的我知道它是有效的,因为只有 T can be String 的可能值我想知道警告。

【问题讨论】:

  • 警告信息说明了一切。你怎么能想出一个扩展final字符串的类?所以T 肯定是String
  • @Thor84没有看到编辑过的问题和axtavt的回答

标签: java generics


【解决方案1】:

基本上,T 只有一种可能的类型,那就是String 本身。所以基本上你的通用 Car 类只是名称上的通用。您也可以将类中所有T 的实例替换为String

也许你的意思是public class Car&lt;T extends CharSequence&gt; ...


允许构造是因为类是有意义的,甚至可能有用。给出警告是因为(在编译器作者看来)您可能犯了一个错误。原因与某些编译器会为您提供以下警告的原因相同:

String NULL = null;
System.err.println(NULL.toString());

这是有意义的,但这是一个错误……除非你打算让它抛出异常。


我可以想到public class Car&lt;T extends SomeFinalClass&gt; 不是错误的两种情况:

  • SomeFinalClass原来不是final的情况。
  • Car 的代码自动生成的情况,而为final 类生成特殊情况代码会很尴尬。

【讨论】:

    【解决方案2】:

    因为 String 在 java 中是最终的,我。 e.你不能扩展那个类。 所以你有警告,因为不存在扩展 String 的类。

    【讨论】:

    • OP 在问为什么允许这样做?
    【解决方案3】:

    如果实际问题是“为什么允许”,那么想象一下将final 关键字添加到现有类的情况。我认为您不希望此更改破坏使用此类作为通用绑定的其他现有代码,因为它仍然是完全合法的。这就是编译器在这种情况下不会发出错误的原因。

    另一方面,如果您不小心将final 类用作泛型绑定,您希望得到通知,因为这样的构造没有意义。这就是编译器发出警告的原因。

    实际上,用警告标记合法但无意义的结构是一种常见的做法。

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 1970-01-01
      • 2010-11-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      相关资源
      最近更新 更多