为什么`T extends String`被允许但是会发出警告?

时间:2012-09-18 10:22:39

标签: java generics

  

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

为什么T extends String被允许但会发出警告?

  

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

public class Car<T extends String> 

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

3 个答案:

答案 0 :(得分:13)

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

另一方面,如果你意外地使用final类作为通用界限,你会被告知,因为这样的结构没有意义。这就是编译器发出警告的原因。

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

答案 1 :(得分: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代码的情况,为{{1}}类生成特例代码会很尴尬。

答案 2 :(得分:2)

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