为什么允许使用 `T extends String` 但会出现警告?

6

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

为什么允许使用T extends String,但会产生警告?

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

public class Car<T extends String> 

我知道什么是final,我知道它有效,因为的唯一可能值是String,我对警告感到惊讶。


2
警告信息已经说明了一切。你怎么能想出一个继承“final”字符串的类呢?所以T肯定是一个字符串。 - Raffaele
@Thor84no,请查看已编辑的问题和 axtavt 的答案。 - Raffaele
3个回答

13

如果实际问题是“为什么允许这样做”,那么想象一下当你向现有类添加final关键字时的情况。我认为你不希望这种更改破坏使用此类作为通用绑定的其他现有代码,因为这仍然是完全合法的。这就是为什么编译器在这种情况下不会发出错误。

从另一方面来看,如果您意外地将final类用作通用绑定,您希望得到通知,因为这样的构造毫无意义。这就是为什么编译器会发出警告的原因。

事实上,将合法但无意义的构造标记为警告是一种常见做法。


3
基本上,它表明只有一种可能的类型,那就是String。所以,你的通用类只是名义上的通用。你可以将类中所有T的实例替换为String。
也许你的意思是public class Car ...
这个结构之所以被允许,是因为这个类是有意义的,甚至可能是有用的。警告是出于编译器作家的观点,认为你可能犯了错误。这样做的原因与某些编译器会对以下内容给出警告的原因相同。
String NULL = null;
System.err.println(NULL.toString());

这是有意义的,但是这是一个错误...除非你打算抛出异常。


我可以想到两种情况下,public class Car<T extends SomeFinalClass>不是错误:

  • SomeFinalClass最初不是final的情况。
  • 生成Car代码的代码自动生成程序,并且为final类生成特殊代码会很麻烦。

3

在Java中,String是final类型的,也就是说你无法扩展这个类。因此,你会收到警告,因为不能存在一个继承自String的类。


3
OP在问为什么允许这样做? - jmj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接