方法重载歧义问题咨询:为何Test2与Test3存在异常?
为什么Test2和Test3会出现方法重载歧义?
要弄明白这几个测试案例的歧义问题,得先搞懂Java方法重载的匹配优先级规则,尤其是可变参数(varargs)、基本类型自动提升和自动装箱/拆箱的优先级关系。
测试1:无歧义的原因
调用doCalc(b, b)时,第一个方法doCalc(byte a, byte b)是精确匹配——实参byte和形参完全一致,优先级最高。第二个方法需要把byte自动装箱成Byte,优先级低于精确匹配,所以编译器直接确定调用第一个方法,不存在歧义。
测试2:编译无歧义,不存在运行时歧义
你提到的“运行时歧义”其实是误解。调用doCalc(b, b)时,两个方法都是可变参数,但Java编译器会优先选择通过基本类型自动提升匹配的方法——也就是doCalc(long... a)。因为在可变参数的匹配逻辑中,基本类型的扩展转换优先级高于自动装箱转换,所以编译阶段就已经敲定了唯一的调用目标,不会出现运行时的不确定性。
测试3:编译时歧义的原因
这里的两个方法doCalc(Byte... a)和doCalc(byte... a),调用时传的byte实参同时满足两种优先级相同的匹配路径:
- 直接把
byte实参打包成byte[],匹配byte...(无需任何类型转换,直接适配可变参数) - 先把每个
byte自动装箱成Byte,再打包成Byte[],匹配Byte...
编译器无法判断应该选择哪一个路径,因此会直接抛出编译错误,也就是所谓的编译时歧义。
内容的提问来源于stack exchange,提问作者Abe
相关产品推荐
相关产品推荐

