當編寫一個泛型方法來處理表單數據時,我遇到了以下(正如我所看到的)未經處理的行爲。給出下面的代碼:爲什麼泛型方法在賦值中更改參數化類型?
public class Test {
public <T> void someGenericMethod(Integer a) {
@SuppressWarnings("unchecked")
T t = (T) a;
System.out.println(t);
System.out.println(t.getClass());
}
public static void main(String[] args) {
Test test = new Test();
test.<BigDecimal>someGenericMethod(42);
}
}
AFAIK,上述代碼應生成在管線T t = (T) a
一個ClassCastException
因爲在主方法調用被設置參數化類型BigDecimal
和從Integer
爲BigDecimal鑄造是不允許的,相反地我所料,該程序執行好並打印以下內容:
42
class java.lang.Integer
事實上,如果我添加其他參數的方法簽名(像String b
)再拍分配新建分配FY T t2 = (T) b
,程序打印
42
class java.lang.String
爲什麼t
變量改變它的類型Integer
(是,任何機會,使一些種推廣的T類型爲Object)?
對這種行爲作出任何解釋,歡迎
是的,是一個未經檢查的演員,但爲什麼不扔'ClassCastException'而不是改變'T'到'Object'的類型? – higuaro
因爲這是一個未經檢查的演員。運行時無法檢查演員表的有效性。如果運行時可以檢查轉換,它會看到它是無效的,並拋出一個'ClassCastException';但它不能,所以它不會,也不會。我不知道你爲什麼期望別的。 – ruakh
幾乎未經檢查的轉換的_definition_是,如果在運行時已知完整類型信息,它將無法檢查是否拋出了「ClassCastException」。 –