Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么foo(1,2,3)没有作为整数[]传递给varargs方法foo(Object…)_Java_Variadic Functions_Autoboxing - Fatal编程技术网

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

Java 为什么foo(1,2,3)没有作为整数[]传递给varargs方法foo(Object…),java,variadic-functions,autoboxing,Java,Variadic Functions,Autoboxing,请注意以下代码行: 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("------------------------------------

请注意以下代码行:

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)
的情况下,Integer[]的术语
bar instanceof为false


如果在这些情况下,bar不是
Integer[]
的实例,那么它是什么的实例?

bar不是整数数组的情况是因为它是您在
foo
方法签名中指定的对象数组:
对象。。。args
对象[]args
的语法糖,当解析为该方法时,编译器将创建一个对象数组

为了始终拥有整数数组,您可以将
foo
方法签名更改为
foo(Integer…args)

  • foo(1,2,3)
这一个将
1
2
3
自动装箱到
Integer
(s),由于它们是
Object
子类型,因此创建了一个
Object[]
数组,由三个
Integer
组成。数组
对象[]
不是
整数[]
,这就是为什么会得到
false


  • foo(新整数(1)、新整数(2)、新整数(3))
在这里,不应用自动装箱,但最终您将再次拥有一个由三个
整数组成的数组
对象[]
。同样,
Object[]
不是
Integer[]
,这就是为什么会得到
false


  • foo(新整数[]{1,2,3})
这里只有一个参数,与前两种情况不同,在前两种情况下,将三个参数包装到一个数组中。因此,只有一个参数
Integer[]
,在运行时,Integer[]
的比较
条实例将返回
true
,因为整数是您实际拥有的


  • foo(新整数[]{新整数(1)、新整数(2)、新整数(3)})

与前一个相同-在运行时,您将检查所提供的数组
Integer[]
是否是
Integer
s的数组,在调用
foo(1,2,3)的情况下,这是
true
编译器(在本例中为
javac
)生成代码
foo(新对象[]{newinteger(1)、newinteger(2)、newinteger(3)})

javac
应用和的规则。编译器生成一个
Object
数组,因为
Object…
表示
Object[]
。因此,
bar
不是
Integer[]
的实例。它只是语法上的糖。

根据:

如果RelationalExpression的值不为null,并且引用可以转换为ReferenceType(§15.16),而不引发ClassCastException,则instanceof运算符的结果为true


在您的例子中,
对象[]
参数不能强制转换为
整数[]
,因此它返回false。

Varargs只是创建和传递数组的语法糖。因为您将方法定义为

public static void foo(Object... bar) 
如果将方法调用为
foo(1,2,3)
foo(新整数(1)、新整数(2)、新整数(3)),Java将为您创建一个
Object[]
数组


但是,您也可以将自己的数组传递给需要varargs参数的方法。在这种情况下,Java不会为您创建新的数组,它只是传递您创建的数组。在最后两个调用中,您显式创建了一个
整数[]
数组。

我认为第一个和第二个应该是对象数组,而不是整数数组。例如,您可以将字符串传递给varargs,它最初应该是
对象[]
,而不是
整数[]
。对于最后两个问题,您将明确地传递一个
整数[]
,因此您的条件现在将为真。这是一个有趣的问题!一个建议:尝试添加
foo(newint[]{1,2,3})的测试。结果将从混乱变为怪异@Lii oh well:D将
int[]
解释为单个对象,而不是包装所有
int
s!很好的补充!啊,好吧,我想我现在明白我的错误了。我(错误地)假设一个只包含
整数的
对象[]
将是一个
整数[]
(仔细想想,这当然是错误的!)谢谢!对演员们说:这就是我第一次遇到这个问题的原因;)