Java 为什么允许使用'T extends String',但给出警告?

Java 为什么允许使用'T extends String',但给出警告?,java,generics,Java,Generics,可能重复: 为什么允许T扩展字符串,但给出警告 类型参数T不应受最终类型字符串的限制。最终类型不能进一步扩展 公车 我知道什么是final,我知道它是有效的,因为只有T的可能值可以是String我想知道警告。因为java中的String是final,I。E你不能扩展那个类。 所以你有警告,因为不可能存在扩展字符串的类。基本上,它是说T只有一种可能的类型,那就是String本身。所以基本上你的泛型Car类只是名字上的泛型。您也可以将类中的T的所有实例替换为String 也许你的意思是公车 该

可能重复:

为什么允许
T扩展字符串
,但给出警告

类型参数T不应受最终类型字符串的限制。最终类型不能进一步扩展

公车

我知道什么是final,我知道它是有效的,因为只有
T的可能值可以是String
我想知道警告。

因为java中的
String
是final,I。E你不能扩展那个类。
所以你有警告,因为不可能存在扩展字符串的类。

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

也许你的意思是
公车


该构造是允许的,因为该类是有意义的,甚至可能是有用的。发出警告是因为(在编译器编写人员看来)您可能犯了错误。原因与某些编译器针对以下内容向您发出的警告相同:

String NULL = null;
System.err.println(NULL.toString());
这是有意义的,但这是一个错误。。。除非您打算它抛出异常


我可以想到两种情况,
公共级汽车
不是一个错误:

  • SomeFinalClass
    最初不是
    final
  • 自动生成
    Car
    代码的情况,为
    final
    类生成特殊案例代码会比较麻烦
如果实际问题是“为什么允许”,那么想象一下在现有类中添加
final
关键字时的情况。我认为您不希望此更改破坏将此类用作泛型绑定的其他现有代码,因为它仍然是完全合法的。这就是为什么编译器在这种情况下不会发出错误

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


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

警告消息说明了一切。如何生成一个扩展
final
字符串的类?因此,
T
肯定是一个
字符串
@Thor84no查看编辑后的问题,其回答是:为什么允许这样做?简短且切中要害的回答。竖起大拇指!
String NULL = null;
System.err.println(NULL.toString());