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.