gpt4 book ai didi

java - 为什么 foo(1,2,3) 没有作为 Integer[] 传递给可变参数方法 foo(Object...)

转载 作者:太空狗 更新时间:2023-10-29 22:32:13 24 4
gpt4 key购买 nike

请注意以下代码行:

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);

这个自动将 123 装箱为 Integer(s),因为它们是 Object 子类型,创建一个 Object[] 数组,由三个 Integer 组成。数组 Object[] 不是 Integer[],这就是你得到 false 的原因。


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

在这里,没有应用自动装箱,但最后您将再次拥有一个由三个 Integer 组成的数组 Object[]。同样,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 的数组,即 true.

关于java - 为什么 foo(1,2,3) 没有作为 Integer[] 传递给可变参数方法 foo(Object...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34061124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com