Varargs 方法和原始类型

2 java variadic-functions

J. Bloch在《Effective Java》中提到,对原始类型使用 varargs 方法是不安全的。准确地说,Arrays.asList(1, 2, 4)有返回类型List<int[]>,听起来很合理。现在我尝试自己重现这种行为,但无法:

在此输入图像描述

我的问题是为什么类型被推导为List<Integer>而不是List<int[]>如他所说的那样?这是否意味着,在 Java 8 中,有关 varargs 的问题不再相关,如果我们不太关心性能,我们可以在任何我们想要的地方安全地使用它们。

小智 5

作者最有可能的意思是您不能传递原始类型元素数组并期望它像这样装箱

int[] intArray = {1,2,3};
Arrays.asList(intArray);
Run Code Online (Sandbox Code Playgroud)

它将返回List<int[]>not List<Integer>,因为没有数组的自动装箱,因此varargint[]->Integer[]可以使用的唯一可能类型T...int[]因为泛型类型T不能表示原始类型。


另一个可能的问题是,您正在阅读本书的第一版(2001 年发布),但自动装箱是在 2004 年发布的 Java 1.5(Java 5.0)中添加的。