为什么允许使用T extends String
,但会产生警告?
类型参数T不应该受到最终类型String的限制。最终类型不能进一步扩展。
public class Car<T extends String>
我知道什么是final,我知道它有效,因为的唯一可能值是String,我对警告感到惊讶。
为什么允许使用T extends String
,但会产生警告?
类型参数T不应该受到最终类型String的限制。最终类型不能进一步扩展。
public class Car<T extends String>
我知道什么是final,我知道它有效,因为的唯一可能值是String,我对警告感到惊讶。
如果实际问题是“为什么允许这样做”,那么想象一下当你向现有类添加final
关键字时的情况。我认为你不希望这种更改破坏使用此类作为通用绑定的其他现有代码,因为这仍然是完全合法的。这就是为什么编译器在这种情况下不会发出错误。
从另一方面来看,如果您意外地将final
类用作通用绑定,您希望得到通知,因为这样的构造毫无意义。这就是为什么编译器会发出警告的原因。
事实上,将合法但无意义的构造标记为警告是一种常见做法。
String NULL = null;
System.err.println(NULL.toString());
这是有意义的,但是这是一个错误...除非你打算抛出异常。
我可以想到两种情况下,public class Car<T extends SomeFinalClass>
不是错误:
SomeFinalClass
最初不是final
的情况。Car
代码的代码自动生成程序,并且为final
类生成特殊代码会很麻烦。在Java中,String
是final类型的,也就是说你无法扩展这个类。因此,你会收到警告,因为不能存在一个继承自String的类。