原始和对象的不同varargs优先级

时间:2014-03-23 13:11:39

标签: java overloading

请帮我解释一下这段代码行为:

public class Main {
      public static void var(Object... x) {
        System.out.println("Object");
    } 

    public static void var(Integer... x) {
        System.out.println("Integer...");
    }

    public static void main(String... args) {
        byte i = 0;
        Integer i2 = 127;
        var(i, i2);
    }
}

上面的代码返回Object...

public class Main {
      public static void var(Object... x) {
        System.out.println("Object");
    } 

    public static void var(int... x) {
        System.out.println("int...");
    }

        public static void main(String... args) {
            byte i = 0;
            Integer i2 = 127;
            var(i, i2);
        }
    }

java: reference to var is ambiguous, both method var(java.lang.Object...) in inheritanceTest.Main and method var(int...) in inheritanceTest.Main match

我有这些问题。

  1. 为什么每个代码变量Do返回对应值
  2. 这些代码段之间存在哪些主要差异。
  3. 真的我很多时候都无法理解这部分jls。我的同事也不知道。

1 个答案:

答案 0 :(得分:2)

第一次使用Object...Integer...

Integer...无法匹配的原因是java在一次操作中不会同时执行自动扩展强制转换自动装箱。这意味着只需将byte 转换为Integer,只需将其传递给方法并希望byte - > int - > Integer。因此,唯一的匹配是自动将byte添加到Byte并匹配Object...

使用Object...int...的第二次尝试:

Java 可以为第一个参数执行从byteint的自动扩展广告,并自动取消装箱Integer到{{1所以int匹配。但它也可以自动将int...添加到byte并离开Byte,以匹配Integer

这不是优先事项。这是java可以在一个步骤中自动执行的操作 - 它可以 auto-box / unbox 自动执行扩展转换。