这个程序来自有效的java第2版书籍,我无法理解int []如何转换为List。有人可以帮我解释一下吗。 包装示例。第4章。项目18;
// 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);
}
}
答案 0 :(得分:2)
该示例提供了一种将原始int数组快速包装为LIst of Integers的方法。在内部,它使用自动装箱在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
}
}
诀窍是 final int [] a 可用于实现方法。
之后我们只需要提供 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;
}
答案 1 :(得分:2)
此博客文章详细讨论了骨架实现:1