2011-02-22 58 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不在意,它會爲你編譯代碼。