为什么原始类型的数组不被视为对象

时间:2011-12-03 00:53:14

标签: java arrays params primitive-types

我知道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

3 个答案:

答案 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作为容器呢?