为什么T extends String
允许但给出警告?
类型参数 T 不应受最终类型 String 的限制。最终类型无法进一步扩展
public class Car<T extends String>
T can be String
我知道什么是最终的我知道它是有效的,因为我想知道警告的唯一可能值。
为什么T extends String
允许但给出警告?
类型参数 T 不应受最终类型 String 的限制。最终类型无法进一步扩展
public class Car<T extends String>
T can be String
我知道什么是最终的我知道它是有效的,因为我想知道警告的唯一可能值。
如果实际问题是“为什么允许”,那么想象一下将final
关键字添加到现有类的情况。我认为您不希望此更改破坏使用此类作为通用绑定的其他现有代码,因为它仍然是完全合法的。这就是编译器在这种情况下不会发出错误的原因。
另一方面,如果您不小心将final
类用作泛型绑定,您希望得到通知,因为这样的构造没有意义。这就是编译器发出警告的原因。
实际上,用警告标记合法但无意义的结构是一种常见的做法。
因为String
在java 中是最终的,即你不能扩展那个类。所以你有警告,因为不存在扩展 String 的类。
基本上,它是说只有一种可能的类型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
。