Gus*_*avo 5 java variadic-functions
1)好的
List<int[]> listOfArrays1 = Arrays.asList( new int[]{1, 2} );
Run Code Online (Sandbox Code Playgroud)
2)好的
List<int[]> listOfArrays2 = Arrays.asList( new int[]{1, 2}, new int[]{3, 4} );
Run Code Online (Sandbox Code Playgroud)
3)编译错误 Type mismatch: cannot convert from List<Integer> to List<Integer[]>
List<Integer[]> listOfArrays3 = Arrays.asList( new Integer[]{1, 2} );
Run Code Online (Sandbox Code Playgroud)
4)好的
List<Integer[]> listOfArrays4 = Arrays.asList( new Integer[]{1, 2}, new Integer[]{3, 4} );
Run Code Online (Sandbox Code Playgroud)
这是签名asList:public static <T> List<T> asList(T... a)
asList期望0或更多类型为"a".我的"a"是new Integer[]{1, 2},它是类型Integer[].那么,为什么它会产生一个List<Integer>而不是一个List<Integer[]>?
让我们看一下问题示例(第三):
List<Integer[]> listOfArrays3 = Arrays.asList( new Integer[]{1, 2} );
Run Code Online (Sandbox Code Playgroud)
正如您所展示的,方法签名是:
public static <T> List<T> asList(T... a)
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,正在考虑将单曲Integer[]用于T.... 可以向 提供数组或未指定数量的同一对象T...。由于您指定了一个数组,因此T被视为Integer(并T...变为Integer[])。
当您提供 anint[]作为单个参数(1st)时,编译器不会自动将其包装为 an,Integer[]因为这样的对象与int[]. 因为int不是对象,所以唯一适合的对象类型T是int[](将参数构建为int[][])。
提供两个int[]s (2nd)更为明显,因为编译器只能将两个数组视为T...s int[],因此T...也是int[][]。
当您提供两个Integer[]s (4th)时,更明显的是,编译器别无选择,只能将组成的两个参数视为T...(Integer[]变成单个数组Integer[][]:)。
编辑:提供一个数组作为可变参数:
您可以提供单个数组作为可变参数。让我们举一个没有泛型的例子:
public int iLoveMeSomeInts(int...nums)
Run Code Online (Sandbox Code Playgroud)
向此方法提供 anint[]作为参数确实有效。int为了验证签名,该数组被视为 s 的 vararg ,然后该 vararg 被视为int[]用于方法内部逻辑的 an 。
您的示例的不同之处在于参数是T.... 泛型T 必须是一个对象,因此在这种情况下编译器不能将 an 视为int[]vararg int...。然后编译器别无选择,只能将 视为int[]vararg 中的单个元素int[]...(因为int[]是一个对象)。这一点没有任何含糊之处。
但是,因为Integer 是一个对象,所以编译器将使用单个Integer[]as Integer...。
更酷的是:如果您想要Integer[]使用有问题的方法返回,并且仍然只提供一个Integer[],您可以调用:
Arrays.<Integer[]>asList(new Integer[] {1, 2});
Run Code Online (Sandbox Code Playgroud)
这迫使编译器将您的单Integer[]视为Integer[]....