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

Par*_*alo 18 java autoboxing variadic-functions

请考虑以下代码行:

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

此代码段的输出是:

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
Run Code Online (Sandbox Code Playgroud)

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

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

Kon*_*kov 24

  • foo(1,2,3);

这一个autoboxes 1,2和3到Integer(一个或多个),并且由于它们是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 []`(思考它,当然是错误的!)谢谢! (4认同)

Ort*_*kni 5

根据Java语言规范:

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

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