6

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

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

类型参数 T 不应受最终类型 String 的限制。最终类型无法进一步扩展

public class Car<T extends String> 

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

4

3 回答 3

13

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

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

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

于 2012-09-18T10:28:40.757 回答
3

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

于 2012-09-18T10:26:16.830 回答
3

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

也许你的意思是public class Car<T extends CharSequence>...


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

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

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


我可以想到两种public class Car<T extends SomeFinalClass>不会出错的情况:

  • SomeFinalClass原本没有的情况final
  • 自动生成代码的情况Car,为类生成特殊情况代码会很尴尬final
于 2012-09-18T10:28:30.960 回答