Varargs 方法和原始类型
Varargs methods and primitive types
在 Effective Java 中,J. Bloch 提到对原始类型使用可变参数方法是不安全的。确切地说,Arrays.asList(1, 2, 4)
有 return 类型 List<int[]>
,这听起来很合理。现在我试图自己重现这种行为,但不能:
我的问题是,为什么类型推导为 List<Integer>
而不是他所说的 List<int[]>
?这是否意味着,在 Java 8 中,关于可变参数的问题不再相关,如果我们不太关心性能,我们可以安全地在我们想要的任何地方使用它们。
作者的意思很可能是您不能传递基本类型元素的数组并期望它像
一样被装箱
int[] intArray = {1,2,3};
Arrays.asList(intArray);
return List<int[]>
而不是 List<Integer>
因为没有像 int[]->Integer[]
这样的数组自动装箱所以只有 T...
可以使用的可能类型vararg 是 int[]
因为通用类型 T
不能表示原始类型。
其他可能的问题是您正在阅读本书的第一版(2001 年发行),但是在 2004 年发行的 Java 1.5(Java 5.0)中添加了自动装箱。
在 Effective Java 中,J. Bloch 提到对原始类型使用可变参数方法是不安全的。确切地说,Arrays.asList(1, 2, 4)
有 return 类型 List<int[]>
,这听起来很合理。现在我试图自己重现这种行为,但不能:
我的问题是,为什么类型推导为 List<Integer>
而不是他所说的 List<int[]>
?这是否意味着,在 Java 8 中,关于可变参数的问题不再相关,如果我们不太关心性能,我们可以安全地在我们想要的任何地方使用它们。
作者的意思很可能是您不能传递基本类型元素的数组并期望它像
一样被装箱int[] intArray = {1,2,3};
Arrays.asList(intArray);
return List<int[]>
而不是 List<Integer>
因为没有像 int[]->Integer[]
这样的数组自动装箱所以只有 T...
可以使用的可能类型vararg 是 int[]
因为通用类型 T
不能表示原始类型。
其他可能的问题是您正在阅读本书的第一版(2001 年发行),但是在 2004 年发行的 Java 1.5(Java 5.0)中添加了自动装箱。