2011-09-07 126 views
1

能否請您解釋這些聲明之間的區別:Java - 啓動不具有泛型類型的泛型變量;

List<Number> test = new ArrayList<Number>(); 
List<Number> test1 = new ArrayList(); 
test.add(new Integer(10)); 
test1.add(new Integer(10)); 
//test.add(new Object()); 
//test1.add(new Object()); 

的add方法做工精細第2調用,最後2失敗。 除第二次初始化時編譯警告外,還有其他的東西嗎?

我理解編譯時類型安全是否基於變量類型(而不是引用的對象類型)是否正確?

預先感謝您。

+0

我不知道,如果你TEST1的附加整數,會是一個對象或一個整數 –

+0

在運行時,它將永遠是一個Object,並添加(通過編譯器)強制轉換爲(Integer) – StKiller

回答

4

有以下兩個聲明之間沒有運行時區別:

List<Number> test = new ArrayList<Number>(); 
List<Number> test1 = new ArrayList(); 

當你發現,有第二編譯時警告。

JVM不能在運行時強制執行一個事實,即您只希望將數字添加到testtest1,因此它在編譯時進行所有檢查。在編譯爲JVM字節碼時,類型消失的事實稱爲類型擦除。

所有這些檢查都是在編譯時發生的,而且這種檢查的確是由被分配的變量的類型驅動的,在你的情況下是List<Number>。您可以將Integer對象添加到這些列表,但不能添加Object對象。編譯器檢測到這個併發出錯誤。

你可能想嘗試以下的小挖得再深到你的問題:

Object x = new Integer(100); 
test.add(x); 
1

我理解編譯時安全性是基於 變量類型(而不是引用的對象類型)嗎?

是的。