<X> X foo(List<? super X> list)
{
return null;
}
void test()
{
List<Number> list = ...;
String s1 = this.foo(list); // huh?
}
最后一行没有任何意义,javac怎么允许呢?
现在,foo()
方法也没有意义;它必须返回 null,没有其他值可以以类型安全的方式返回。因此,运行时的最后一行不会导致任何问题:它将 null 分配给 String 变量。
仍然,静态地,为什么最后一行编译? (javac 1.6 u21 b06)
最佳答案
what compilers do you guys use?
他们可能正在使用 eclipse,因为它不在那里编译。但它是从命令行编译的。 Eclipse 有一些不同的编译机制,以便更快地找出运行时问题。有时它们只是警告,在这种情况下是错误。
List<? super X>
意味着它可以是List<X>
或 List<Object>
.因此它可以编译。另一方面,它不会运行,但 javac 不关心,它会为您编译代码。
关于java - 为什么这个通用代码可以编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5083290/