当前位置:  开发笔记 > 编程语言 > 正文

为什么foo(1,2,3)没有作为整数[]传递给varargs方法foo(Object ...)

如何解决《为什么foo(1,2,3)没有作为整数[]传递给varargs方法foo(Object)》经验,为你挑选了2个好方法。

请考虑以下代码行:

public static void main(String[] args)  {
    foo(1,2,3);
    System.out.println("-------------------------------------");
    foo(new Integer(1), new Integer(2), new Integer(3));
    System.out.println("-------------------------------------");
    foo(new Integer[]{1,2,3});
    System.out.println("-------------------------------------");
    foo(new Integer[] {new Integer(1), new Integer(2), new Integer(3)});
}

public static void foo(Object... bar) {
    System.out.println("bar instanceof Integer[]:\t" + (bar instanceof Integer[]));
    System.out.println("bar[0] instanceof Integer:\t" + (bar[0] instanceof Integer));
    System.out.println("bar.getClass().isArray():\t" + bar.getClass().isArray());
}

此代码段的输出是:

bar instanceof Integer[]:   false
bar[0] instanceof Integer:  true
bar.getClass().isArray():   true
-------------------------------------
bar instanceof Integer[]:   false
bar[0] instanceof Integer:  true
bar.getClass().isArray():   true
-------------------------------------
bar instanceof Integer[]:   true
bar[0] instanceof Integer:  true
bar.getClass().isArray():   true
-------------------------------------
bar instanceof Integer[]:   true
bar[0] instanceof Integer:  true
bar.getClass().isArray():   true

这让我很困惑!我不明白为什么foo(1,2,3)这个词bar instanceof Integer[]是假的.

如果在这些情况下bar不是Integer[]其他实例的实例?



1> Konstantin Y..:

foo(1,2,3);

这一个autoboxes 1,23Integer(一个或多个),并且由于它们是Object子类型,一个Object[]阵列被创建,由三个Integer第 数组Object[]不是Integer[],这就是你得到的原因false.


foo(new Integer(1), new Integer(2), new Integer(3));

在这里,不应用自动装箱,但最后你将再次拥有一个Object[]由三个Integers 组成的数组.再次,Object[]不是Integer[],这就是你得到的原因false.


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

在这里,您只有一个参数,与前两个案例不同,您将三个参数包装在一个数组中.因此,只有一个参数Integer[],在运行时,比较bar instanceof Integer[]将返回true,因为整数是你实际拥有的.


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

与前一个相同 - 在运行时,您将检查提供的数组Integer[]是否是Integers 的数组,即true.


啊好吧,我想我现在看到了我的错误.我(错误地)假设一个`Object []`只有`Integers`的常量将是一个`Integer []`(思考它,当然是错误的!)谢谢!

2> Ortomala Lok..:

根据Java语言规范:

如果RelationalExpression的值不为null并且引用可以在不引发ClassCastException的情况下将引用(第15.16节)转换为ReferenceType,则instanceof运算符的结果为true.

在您的情况下,Object[]参数不能转换为an,Integer[]因此返回false.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有