我知道java中的数组扩展了Objects,所以为什么将它们作为params传递不起作用。
public static void main(String[] args) {
foo(new Integer[]{1, 2, 3}); // 1
foo(new int[]{1,2,3}); //2
}
static void foo(Object... params) {
System.out.println(params[0]);
}
此外,为什么它不将数组视为单个参数(第1行)
运行上述内容的输出是:
1
[I@3e25a5
答案 0 :(得分:5)
在java中,每个带有(X ...)签名的函数都将X数组作为参数。
在第一个示例中,您会收到警告,表示您将整数数组作为vararg对象传递而没有强制转换。 Java非常聪明,您可能希望将其作为Object []而不是单个Object传递。如果向对象[]添加强制转换,警告将消失。
在第二个例子中,数组仅被称为THE FIRST vararg,因为每个数组都是一个对象。它不能作为对象数组传递,因为它是一个基元数组。
任何类型的数组都是对象,因为您可以验证运行此代码片段
public class Test{
public static void test(Object a) {
System.out.println("ok");
}
public static void main(String args[]){
int[] i = {1,2,3,4};
test(i);
}
}
它打印“ok”,这意味着int []是一个Object。 〜
答案 1 :(得分:3)
我刚尝试了你的代码,我得到了:
1
[I@71f6f0bf
问题是,你的方法采用varargs的Object
数组。因此,对于第一次调用,params
是包含每个Integer
个元素的3个元素的数组。但是,int
s不是Object
s(int
的Wrapper类,Integer
,但是int
不是,所以对于第二个call,params
是包含实际数组对象的单个元素的数组。上面的乱码是数组的toString()
方法的输出。
如果您要使用Object[]
替换varargs呼叫,则第二次呼叫将无法编译,因为int[]
不是Object[]
。
答案 2 :(得分:0)
Object ...将数组解释为参数列表,而不是单个对象。 为什么不使用Set作为容器呢?