请解释使用显式强制转换为Object的输出

时间:2013-05-31 14:00:46

标签: java object casting

class VarArgs {
    public static void printArray(Object... args) {
        for (Object obj : args)
            System.out.print(obj + " ");
        System.out.println();
    }

    public static void main(String[] args) {
        printArray( new Integer[] { 1, 2, 3 });
    }
}

控制台的输出是:

   [Ljava.lang.Integer;@1888759 

只是想知道这个输出是什么。假设的castiing是通过Object []并且给出1,2,3作为输出,但是当我使用Object进行投射时我得到了这个输出

4 个答案:

答案 0 :(得分:1)

您可以使用

Arrays.toString(new Integer[]{1,2,3}); 

查看数组的实际内容。

或者将新的Integer [] {1,2,3}转换为Object []而不是Object,即:

printArray((Object[])new Integer[]{1,2,3});

答案 1 :(得分:0)

这与传递数组不同!这与传递可变长度的参数相同,因此该方法将数组视为一个对象,而不是对象数组,因此打印输出。

public static void printArray(Object[] args) {
    for (Object o : args) {
        System.out.println(o);
    }
}

Object[] objects = new Integer[] { 1, 2, 3, 4 };
printArray(objects);

请注意,您需要使用int的包装器,基本类型不是对象的子类。

答案 2 :(得分:0)

  • 解释代码中发生的事情:

    1. 当您调用printArray方法时,您将数组转换为Object,所以实际上您只传递一个对象(不是数组)。

    2. printArray方法中的foreach循环只迭代一次,因为只有一个参数传递给printArray方法 - Integer[] {1,2,3}数组。

    3. 因此,当您的代码调用toString时,将调用Array类中的toString,而不是toString类中的Integer,如您所料

    4. 最后得到的结果:[Ljava.lang.Integer;@1888759是由Java中数组类中缺少toString方法的实现引起的。

  • 要解决代码中的问题:

    替换:

    printArray((Object)new Integer[]{1,2,3});
    

    使用:

    printArray((Object[])new Integer[]{1,2,3});
    
  • 打印数组调用的内容:

    Arrays.toString(new Integer[]{1,2,3}); 
    

答案 3 :(得分:0)

正如Marco所说,这使用了Object的默认toString方法,它是(虚拟)内存地址。

我建议使用Arrays.toString方法here

关于使用变量参数 - 尝试通过运行

来反汇编类文件

javap -verbose VarArgs

看看它编译成什么 - 你应该看到你的整数数组作为数组的单个元素传递。