public class Aman {
void m(Byte b, Integer i) { // autoboxing, autoboxing
}
void m(Number n, int i) { // autoboxing -> widening, no conversion
}
public static void main(String[] args) {
byte b = 23;
Aman obj = new Aman();
obj.m(b, 24);
}
}我读过这个http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2文档,但可以
请有人一步一步地解释为什么方法调用会产生不明确的错误,通过
本文档中描述的步骤。
发布于 2014-04-11 20:31:58
首先,没有不使用装箱/取消装箱的适用方法签名,因此编译器将查找所有适用于装箱(规范参考)的签名。这两种方法都是适用的。
然后,它检查其中一个是否比另一个更具体。这要求一个方法的每个参数类型都是另一个方法的相应参数类型的子类型。由于是不可比拟的,调用是不明确的。
调用m(Integer)和m(int)的原因通常不是模棱两可的,因为在考虑装箱之前,在链接规范的“第一阶段”中找到了适当的方法。在这里,您可以通过将调用更改为:
obj.m(Byte.valueOf(b), 24);发布于 2014-04-11 20:31:37
从您的连系文档中
第一阶段(§15.12.2.2)执行重载解析,不允许装箱或取消装箱转换,也不允许使用可变的方法调用。如果在此阶段没有找到适用的方法,则处理将继续到第二阶段。
这里什么都不会发生,因为没有任何方法匹配(byte, int)而不装箱其中的一个参数。
第二阶段(§15.12.2.3)在允许装箱和取消装箱的同时执行过载解析,但仍然排除了变量性方法调用的使用。如果在此阶段没有找到适用的方法,则处理将继续到第三阶段。
在这个步骤中,如果对参数执行一些装箱操作,这两个方法都匹配。如果选择byte,则参数匹配
void m(Number n, int i) { 如果选择byte和int,则参数匹配。
void m(Byte b, Integer i) { 因此,有几种方法是适用的。
如果在适用性测试的三个阶段中的一个阶段已经确定了几种适用的方法,那么就选择最具体的方法,如§15.12.2.5节所规定的那样。
如果您遍历所有这些规则,您会发现没有更具体的方法,因此调用是不明确的。
https://stackoverflow.com/questions/23021946
复制相似问题