2011-05-25 96 views
3

有人可以解釋我這個整數和整數對偶?

List<Integer> list = new LinkedList<Integer>(); 
list.add(2); 
list.add(1); 
list.add(3); 

當我用

list.remove(1); 

然後第1個要素得到了去除

list.remove(new Integer("1")); 

然後第二個元素得到了清除。

這樣,你能在上面塞納里奧

解釋自動裝箱的行爲和拆箱時new A().a(new Integer("1"));

執行上,1 GO執行

public class A { 
    public void test(Integer i) {} //1 
    public void test(int i) {} //2 
    public void test(Object o) {}//3 
} 

方法

public class A { 
    public void test(int i) {} //2 
    public void test(Object o) {}//3 
} 

方法3執行了

回答

2

基本上,重載分辨率將在參數Integer出現時偏好Object參數而不是int參數。 (當與int論點提出當然,這將傾向於與int參數超過ObjectInteger過載。)

JLS section 15.12.2(與討論剪斷):

確定適用性的該過程開始於確定該可能適用的方法(§15.12.2.1)。該過程的其餘部分分爲三個階段。

討論

師的目的爲階段是確保與舊版本的Java編程語言的兼容性。

第一階段(§15.12.2.2)執行重載解析而不允許裝箱或拆箱轉換,或使用變量arity方法調用。如果在此階段沒有找到適用的方法,則處理繼續到第二階段。

第二階段(§15.12.2.3)在允許裝箱和取消裝箱的同時執行重載解析,但仍然排除使用變量方法調用。如果在此階段沒有找到適用的方法,則處理繼續到第三階段。

第三階段(§15.12.2.4)允許將重載與變量arity方法,裝箱和拆箱相結合。

由於Integer隱式轉換爲Object,重載決議在第一階段成功,那麼就永遠不會爲考慮取消裝箱轉換。

如果這並不能說明您滿意的所有事情,請評論哪一點讓您感到困惑。

1
list.remove(1); 

這裏1是索引,而不是對象,所以無論對象在索引1處存在時,將被刪除

list.remove(new Integer("1")); 

這裏其對象整數(1),將要刪除的

0

的問題是,新的整數(2)是一個對象,但2不是

刪除(1)消除了與索引1

刪除(新的整數(2)刪除Objecte等於所述元件新的整數(2)(兩種方法)

如果添加(1)Java需要一個對象,因爲不存在添加(int)和執行Outboxing。

同樣在你的第二個例子可能發生,雖然它似乎有點混淆(文字不符合代碼) 。

關鍵部分是:整數的取消裝箱操作僅在整數無法使用時執行,即無法使用整數,數字或對象,但可以使用int。

0

重載解析使用最佳匹配候選。在第一種情況下,你傳遞Integer,並且有一個簽名測試(Integer),以便被調用(確切類型匹配)。

在第二種情況下,您傳遞Integer,並且兩個可能的候選者是test(int)和test(Object)。在這種情況下,語言將Object upcast定義爲與拆箱int更接近的匹配,因此選擇了Object版本。

有一個重載分辨率轉換列表here。正如你所看到的,參考範圍比拆箱更高。

0

Java language specification

第一階段(§15.12.2.2)執行 重載解析而不允許 拳擊或取消裝箱轉換,

...

這保證了任何 在 語言的舊版本中有效的呼叫不被認爲是模糊的 由於引入了 變量arity方法,隱式 裝箱和/或拆箱。

0

List提供了方法:

public boolean remove(Object o) // removes the first occurence of this object 
public boolean remove(int i)  // removes object stored at index i 

如果我們做一個list.remove(new Integer(1))那麼該呼叫的最佳匹配的是第一種方法(刪除的對象)。

0

上有一個列表指定了兩個刪除功能:

雖然Java不進行自動裝箱(我相信它會,如果List.remove(INT )方法不存在),這裏的想法是確定調用哪個方法。由於有一個原始的int有效的操作,這將在任何自動裝箱發生之前被調用。