2010-12-13 101 views
1

這個程序是從有效的Java第二版書,我無法理解如何將int []轉換爲List。有人可以幫我解釋這一點。 封裝例子。第四章。這個骨架實現如何工作

// Concrete implementation built atop skeletal implementation - Page 95 


import java.util.*; 



public class IntArrays { 

static List<Integer> intArrayAsList(final int[] a) { 
      if (a == null) 
     throw new NullPointerException(); 

return new AbstractList<Integer>() { 
    public Integer get(int i) { 
    return a[i]; // Autoboxing (Item 5) 
    } 

    @Override 
    public Integer set(int i, Integer val) { 
    int oldVal = a[i]; 
    a[i] = val; // Auto-unboxing 
    return oldVal; // Autoboxing 
    } 

    public int size() { 
    return a.length; 
    } 
}; 
    } 

    public static void main(String[] args) { 
int[] a = new int[10]; 
for (int i = 0; i < a.length; i++) 
    a[i] = i; 
List<Integer> list = intArrayAsList(a); 

Collections.shuffle(list); 
System.out.println(list); 
    } 
} 

回答

2

的例子是給一種快速包裹原始整數數組成整數列表。它在內部使用自動裝箱來在int和Integer之間進行轉換。該技術可能是有用的,因爲int []和List之間沒有類似的轉換。

基本技巧是構建AbstractList的匿名實現。

public class IntArrays { 

    static List<Integer> intArrayAsList(final int[] a) { 
    if (a == null) 
     throw new NullPointerException(); 


    return new AbstractList<Integer>() { 
     // code here 
    } 
} 

訣竅則存在最終INT []一個 availble的是向實施方法。

之後,我們只需要提供由AbstractList定義的接口的實現方法,即get(),set()和size()方法。

所以這些都很明顯,很好地利用自動裝箱。

public Integer get(int i) { 
      return a[i]; // Autoboxing (Item 5) 
} 


public Integer set(int i, Integer val) { 
     int oldVal = a[i]; 
     a[i] = val; // Auto-unboxing 
     return oldVal; // Autoboxing 
} 

public int size() { 
    return a.length; 
} 
+0

其實我質疑如何被構造的名單!現在我仔細研究了代碼,然後再次瞭解它。謝謝 – John 2010-12-13 13:04:45