模糊重载方法调用已解决

Jay*_*esh 4 java overloading

当我调用时,call('a');它输出"char"并且它很好,因为char原始类型将优先于将其装入Character.

static void call(char i){
    System.out.println("char");
}

static void call(Character i){
    System.out.println("Character");
}
Run Code Online (Sandbox Code Playgroud)

如何调用call('a', 'a');是模棱两可的?

static void call(char i, Character j){
    System.out.println("char");
}

static void call(Character i, Character j){
    System.out.println("Character");
}
Run Code Online (Sandbox Code Playgroud)

我想的是第二个参数编译器必须去Boxing和第一个参数完全匹配是char原始类型,所以调用call('a','a');可以解析为call(char i, Character j)方法.

显然我理解错了,有人请解释一下.

解释特定这种示例的一些链接将是有帮助的.

Jon*_*eet 5

如何调用call('a', 'a');是模棱两可的?

因为为了使(char i, Character j)重载适用,所以围绕拳击的规则发挥作用 - 并且在那时两个呼叫都是适用的.这是确定方法签名的第二阶段(JLS 15.12.2):

  1. 第一阶段(§15.12.2.2)执行重载解析而不允许装箱或拆箱转换,或使用变量arity方法调用.如果在此阶段没有找到适用的方法,则处理继续到第二阶段.

  2. 第二阶段(§15.12.2.3)执行重载解析,同时允许装箱和拆箱,但仍然排除使用变量arity方法调用.如果在此阶段没有找到适用的方法,则处理继续到第三阶段.

因此,在阶段2中,两种方法都适用,但确定最具体方法的规则(JLS 15.12.2.5)不会使任何一个调用彼此更具体.这不是"未装箱比盒装更具体"的问题 - 这是"我可以解决这个没有任何拳击"的问题"我可以用拳击解决这个问题".