2011-02-22 57 views
3
<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

+0

我得到`类型不匹配:无法从数字转换为字符串`错误。 – 2011-02-22 20:07:44

+0

对我不起作用 – 2011-02-22 20:08:40

+0

它不能编译。 – GriffeyDog 2011-02-22 20:11:10

回答

0

代码不会在下一个JDK版本1.6.0_22-b04中编译。错误是:

类型不匹配:不能转换从数为String

我猜你的编译器错误的建议,可能是真的。

0

您的代码将无法编译。该方法的返回类型是<X>。当您调用方法foo时,您传递的模板参数为Number。虽然可以将空值赋给字符串,但是您的方法签名变为Number foo(),这意味着您要返回Number。因此,编译器将不允许您将Number分配给String

4

你们用什么编译器?

他们可能使用eclipse,因为它不能在那里编译。但它从命令行编译。 Eclipse有一些不同的编译机制,以便尽早发现运行时问题。有时他们只是警告,在这种情况下,这是一个错误。

List<? super X>意味着它可以是List<X>List<Object>。因此它可以编译。另一方面,它不会运行,但javac不在意,它会为你编译代码。