我正在读这个答案,它说的是
另请注意,使用显式数组参数调用泛型vararg方法可能会默默地产生与预期不同的行为:
Run Code Online (Sandbox Code Playgroud)public <T> void foo(T... params) { ... } int[] arr = {1, 2, 3}; foo(arr); // passes an int[][] array containing a single int[] element
类似的行为在这个答案得到解释3:
Run Code Online (Sandbox Code Playgroud)int[] myNumbers = { 1, 2, 3 }; System.out.println(ezFormat(myNumbers)); // prints "[ [I@13c5982 ]"Varargs仅适用于引用类型.自动装箱不适用于基元数组.以下作品:
Run Code Online (Sandbox Code Playgroud)Integer[] myNumbers = { 1, 2, 3 }; System.out.println(ezFormat(myNumbers)); // prints "[ 1 ][ 2 ][ 3 ]"
我尝试了更简单的例子:
private static <T> void tVarargs(T ... s)
{
System.out.println("\n\ntVarargs ==========");
System.out.println(s.getClass().getName());
System.out.println(s.length);
for(T i : s)
System.out.print(s + ",");
}
private static void objVarargs(Object ... a)
{
System.out.println("\n\nobjVarargs =========== ");
System.out.println(a.getClass().getName());
System.out.println(a.length);
for(Object i : a)
System.out.print(i + ",");
}
int[] intarr = {1,2,3};
Integer[] Intarr = {1,2,3};
objVarargs(intarr);
objVarargs(Intarr);
tVarargs(intarr);
tVarargs(Intarr);
Run Code Online (Sandbox Code Playgroud)
这打印
objVarargs ===========
[Ljava.lang.Object;
1
[I@7852e922,
objVarargs ===========
[Ljava.lang.Integer;
3
1,2,3,
tVarargs ==========
[[I
1
[[I@4e25154f,
tVarargs ==========
[Ljava.lang.Integer;
3
[Ljava.lang.Integer;@70dea4e,[Ljava.lang.Integer;@70dea4e,[Ljava.lang.Integer;@70dea4e,
Run Code Online (Sandbox Code Playgroud)
intarr到tVarargs导致创建单个的2维阵列 [[I机智单个元件.但是,这个数组的类型是什么?intarr 给objVarargs()创建包含单个数组元素的一维 数组.[Ljava.lang.Object有人能否对前两种行为有更多的了解?这两种不同的行为或相同的行为,我的意思是背后有不同或相同的原因.这些原因究竟是什么?是否有其他案例导致不同的意外行为?
这两个行为来自同一个问题 - 泛型类型参数和Object变量只能保存引用类型.基元(例如int)不是引用类型,因此将int数组传递给varargs方法(无论是否为Object ... a或者T ... s)都会导致接受具有单个元素的数组的方法,并且该单个元素是int数组.
因此,您可以将其视为包含单行的二维int数组(即int[][]).
请注意,您有一个拼写错误tVarargs(T ... s)导致输出混乱.它应该是System.out.print(i + ",");,而不是System.out.print(s + ",");
修复后,两种方法都会为Integer[]输入生成相同的输出:
[Ljava.lang.Integer;
3
1,2,3,
Run Code Online (Sandbox Code Playgroud)
int[]输入的输出差异来自于以下事实:objVarargs(Object ... a)varargs数组的类型是Object[],并且在tVarargs(T ... s)其中T[](并且何时T是int[],数组的类型是a int[][]).
BTW,[[I是二维int数组的类名(即int[][]).
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |