java中的方法规则重载解释

java中的方法规则重载解释,java,overloading,Java,Overloading,我试图理解使用java编译器的重载规则 这对我来说太难了 public class Main { public static void var(Long x) { System.out.println("Long"); } public static void var(int... x) { System.out.println("int... x"); } public static void main(Strin

我试图理解使用java编译器的重载规则

这对我来说太难了

public class Main {

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

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


    public static void main(String... args) {
          var(5);
    }
}
输出:

int...
object
在互联网上,我发现了下一条规则:

  • 基本体加宽>装箱>变量
  • 不允许加宽和装箱(WB)
  • 允许装箱和加宽(BW)
  • 重载时,加宽+vararg和装箱+vararg只能以相互排斥的方式使用,即不能同时使用

  • 不允许在包装类之间加宽
  • 但我不能将此规则应用于此代码行为

    你能帮我吗

    我的错误版本:

    装箱
    int
    ->
    Integer
    并扩大到
    Long

    补充问题 输出:

    int...
    
    object
    
    装箱
    int
    Integer
    并加宽到
    Long


    虽然
    int
    to
    Integer
    装箱可以,但是
    Integer
    to
    Long
    不是有效的加宽
    Long
    不是
    整数的超类型。所以这是无效的。一个选项是加宽,然后是装箱。但是这种转换在Java中是不允许的。所以剩下的唯一选择就是使用varargs。

    好吧,答案是:不允许加宽和装箱(WB)。要调用耗时很长的方法,必须将int 5加宽为Long,然后装箱为Long。这是不允许的。允许装箱int->Integer并加宽到LongBoxing和加宽(BW)。不允许在包装类之间加宽。无论如何,规则是非常复杂的,而真相的来源是JSL。对我来说,jls super extra Extract Complexity的一部分我注意到了另一个奇怪的行为。你能解释一下吗?(在主题中添加)@gstackoverflow,即装箱后加宽<代码>整数
    对象
    是一个有效的加宽区域。装箱+加宽-第三个,但varargs-在第一个step@gstackoverflow只要记住一件事,方法重载->
    varargs
    排在最后。编译器总是首先尝试精确匹配,然后加宽,然后装箱,然后装箱,然后加宽,然后变参数。JLS中有规则。是否存在vararg+加宽和vararg+装箱