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());