请考虑以下代码行:
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[]
其他实例的实例?
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[]
由三个Integer
s 组成的数组.再次,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[]
是否是Integer
s 的数组,即true
.
根据Java语言规范:
如果RelationalExpression的值不为null并且引用可以在不引发ClassCastException的情况下将引用(第15.16节)转换为ReferenceType,则instanceof运算符的结果为true.
在您的情况下,Object[]
参数不能转换为an,Integer[]
因此返回false.