2011-12-03 140 views
3

我知道java中的数组扩展了对象,所以为什么将它们作为参数传递不起作用。为什么原始类型的数组不被视为对象

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 
[[email protected] 
+1

我不明白你的问题是什么。你的意思是“不起作用”? –

+0

它不打印1(第2行) –

回答

5

在java中与每一个功能(X ...)签名需要一个X数组作为参数。

在你的第一个例子中,你会发出警告,你没有强制转换,而是将整数数组作为可变参数对象传递。 Java足够聪明,你可能想将它作为Object []而不是单个Object传递给它。如果向Object []添加强制转换,则警告消失。

在第二个例子中,数组只是第一个可变参数,因为每个数组都是一个对象。它不能作为一个对象数组传递,因为它是一个基元数组。任何类型的

阵列是作为可以验证运行此代码片段

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 []是一个对象的对象。 〜

+0

的值,但自动装箱怎么样,为什么它没有把它们装入物体? –

+0

@sleimanjneidi - 因为这不是自动装箱的方式。 Autoboxing会将int转换为Integer,但不会将int []转换为Integer []。为什么?因为它会导致比解决问题更多的问题! –

0

Object ...将数组解释为参数列表,而不是单个对象。 为什么不使用Set作为容器?

3

我只是想你的代码,我也得到:

1 
[[email protected] 

的事情是,你的方法需要通过可变参数Object阵列。所以,对于第一个电话,params是包含每个人Integer 3个元素的数组。但是,int s不是Object s(int的包装类,Integer,但是int不是),因此对于第二个调用,params是包含实际数组对象的单个元素的数组。上面的乱码是数组的toString()方法的输出。

如果您将用Object[]替换可变参数呼叫,则第二个呼叫将不会编译,因为int[]不是Object[]

相关问题