当我调用时,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)方法.
显然我理解错了,有人请解释一下.
解释特定这种示例的一些链接将是有帮助的.
如何调用
call('a', 'a');是模棱两可的?
因为为了使(char i, Character j)重载适用,所以围绕拳击的规则发挥作用 - 并且在那时两个呼叫都是适用的.这是确定方法签名的第二阶段(JLS 15.12.2):
第一阶段(§15.12.2.2)执行重载解析而不允许装箱或拆箱转换,或使用变量arity方法调用.如果在此阶段没有找到适用的方法,则处理继续到第二阶段.
第二阶段(§15.12.2.3)执行重载解析,同时允许装箱和拆箱,但仍然排除使用变量arity方法调用.如果在此阶段没有找到适用的方法,则处理继续到第三阶段.
因此,在阶段2中,两种方法都适用,但确定最具体方法的规则(JLS 15.12.2.5)不会使任何一个调用彼此更具体.这不是"未装箱比盒装更具体"的问题 - 这是"我可以解决这个没有任何拳击"的问题"我可以用拳击解决这个问题".
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |