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

Sle*_*idi 3 java arrays params primitive-types

我知道java中的数组扩展了对象,所以为什么将它们作为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]);
}
Run Code Online (Sandbox Code Playgroud)

此外,为什么它不将数组视为单个参数(第1行)

运行以上输出是:

1
[I@3e25a5
Run Code Online (Sandbox Code Playgroud)

sou*_*eck 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它打印"ok",这意味着int []是一个Object.〜