java认证考试的重载方法

java认证考试的重载方法,java,methods,overloading,java-11,Java,Methods,Overloading,Java 11,我正在准备Java认证考试,有一件事我不明白: 类计算器{ 公共静态长加(int a,long…b){ System.out.println(“int a,Var args long b”); 整数总计=a; 用于(长val:b){ 总+=val; } 返回总数; } 公共静态长加(int a,long b){ System.out.println(“int+Long”); 返回a+b; } } 公共类重载测试{ 公共静态void main(字符串[]args){ var结果=计算器。添加(1,

我正在准备Java认证考试,有一件事我不明白:

类计算器{
公共静态长加(int a,long…b){
System.out.println(“int a,Var args long b”);
整数总计=a;
用于(长val:b){
总+=val;
}
返回总数;
}
公共静态长加(int a,long b){
System.out.println(“int+Long”);
返回a+b;
}
}
公共类重载测试{
公共静态void main(字符串[]args){
var结果=计算器。添加(1,2);
System.out.println(“结果=”+结果);
}
}
Java文档()说:

1-第一阶段执行重载解析,不允许装箱或取消装箱转换,也不允许使用变量arity方法调用。如果在此阶段没有找到适用的方法,则处理继续到第二阶段

2-第二阶段执行重载解析,同时允许装箱和取消装箱,但仍然禁止使用变量arity方法调用。如果在此阶段没有找到适用的方法,则处理继续到第三阶段

3-第三阶段允许重载与变量arity方法、装箱和取消装箱相结合

因此,有了这些规则,我认为这应该发生:

  • Calculator.add(1,2)
    查找
    (int,int)
    签名,但找不到。它还按此顺序查找
    (int,long)
    (int,float)
    (int,double)
    。因为我们在第1步中,我们没有寻找varargs,所以不应该有匹配项
  • 在此步骤中,它执行装箱/取消装箱。由于我们有
    (int,Long)
    ,我希望结果是
    “int+Long”
  • 在这一步中,它还查找varargs,如果上一步不存在,它应该找到
    “int a,Var args long b”
我在这里错过了什么?我希望结果是
“int+Long”
,但它是
“int a,Var args Long b”


编辑:代码取自作者Tim Buchalka编写的名为Java SE 11 Developer 1Z0-819 OCP课程第1部分的Udemy课程
不能使用添加(1,2)调用,因为2是一个int,并且不能将基本int装箱到Long中。同样,语句
长a=2无效。因此,唯一匹配的候选项是添加(int a,long…b)

重载适用性规则植根于转换规则(JLS Ch5,“转换和上下文”)。定义了不同的转换(原语加宽(int到long)、装箱(int到Integer)、引用加宽(字符串到对象)等)

在任何给定的情况下,任何给定的转换可能适用,也可能不适用,具体取决于上下文。上下文包括赋值上下文、方法调用上下文、强制转换上下文等,重载解析的第一阶段和后面阶段之间的区别在于严格调用上下文和松散调用上下文之间的区别

让您感到困扰的可能是
add(int,Long)
不适用于
(int,int)
,即使在松散的调用上下文中也是如此。这是因为(JLS 5.3)在调用上下文中,加宽原语转换后加上装箱转换不是允许的转换之一。如果您调用了
add(0,0L)
,它将适用(装箱转换)


varargs的情况适用于松散的上下文,因为存在从
int
long

的扩展原语转换,因此原语被解除装箱/装箱到其类型
int
不能装箱到
Long
int
将被装箱为
Integer
。而
整数
不是
,因此我没有任何匹配项。@kee07420。更准确地说,int不能自动装箱到Long,但它可以装箱到Long:
Long.valueOf(2)
。当装箱/拆箱只发生在这些类型的类版本中时,原语类型不是包装了其他原语吗?有趣的事实:当您编写
Long l=0L时;var结果=计算器.add(1,true?2:l)
,可一次性将
int
2
提升为
long
,并装箱为
long
。当您使用
Long l=0L时,更令人兴奋;整数i=2;var结果=计算器.add(1,真?i:l)
,可以将
i
Integer
取消装箱到
int
,将值提升到
long
并将其装箱到
long