2009-08-12 48 views
1

相關this question爲什麼只有在訪問返回值時拋出ClassCastException?

鑑於這一功能:

public static <S extends CharSequence> S foo(S s) { 
    return (S) new StringBuilder(s); 
} 

爲什麼這個調用執行無一例外:

foo("hello"); 

但是這一次拋出ClassCastException異常?

System.out.println(foo("hello")); 
+0

你的編譯器不給你一個警告? – 2009-08-13 03:22:51

+0

它在該方法中發出了警告,但在兩次調用中都沒有發生 - 很好奇爲什麼一個調用起作用,另一個則拋出異常。 – Brabster 2009-08-13 07:52:15

回答

6

泛型5/6是type-erased,這意味着任何泛型類型是從根本上只是一個Object類型(或任何最小公分母類型是,這是在這種情況下CharSequence)在運行時。在需要的地方插入適當的演員。所以,你的方法獲取類型擦除的東西,看起來像這樣:

public static CharSequence foo(CharSequence s) { 
    return (CharSequence) new StringBuilder(s); 
} 

,您的電話獲取類型擦除這樣:

System.out.println((String)foo("hello")); 

顯然,Java將不會打擾如果插入(String)投返回值從不使用 - 爲什麼要麻煩?

3

泛型類型僅適用於編譯器,並且在運行時被刪除(基本省略)。所以中投在Java方法中忽略

相關問題