在 Effective Java 中,J.Bloch提到使用带有原始类型的varargs方法是不安全的。不过,Arrays.asList(1, 2, 4)
的返回类型为List<int[]>
,听起来很合理。现在我尝试自己重现这种行为,并且不能:
我的问题是,为什么类型被推断为List<Integer>
而不是List<int[]>
,如他所述?这是否意味着,在Java 8中,关于varargs的问题已不再适用,如果我们不太关心性能,我们可以安全地在任何地方使用它们。
答案 0 :(得分:4)
作者最有可能意味着你不能传递基本类型元素的数组,并期望它像
一样被加框int[] intArray = {1,2,3};
Arrays.asList(intArray);
将返回List<int[]>
而不是List<Integer>
,因为int[]->Integer[]
之类的数组没有自动装箱,因此只有T...
vararg可以使用的可能类型为{{1}因为泛型类型int[]
不能表示基本类型。
其他可能的问题是您正在阅读第一版的书(2001年发布),但在2004年发布的Java 1.5(Java 5.0)中添加了自动装箱。