【发布时间】:2022-01-13 20:10:15
【问题描述】:
假设我们有这 3 个类:
class A { }
class B extends A { }
public class App {
static void f(int i, A a) { }
static void f(float j, B b) { }
static public void main() {
int i = 0;
B b = new B();
App.f(i, b);
}
}
这会产生错误:
App.java:11: error: reference to f is ambiguous
App.f(i, b);
^
both method f(int,A) in App and method f(float,B) in App match
1 error
既然i是整数,为什么不选择f(int, A)类型?
【问题讨论】:
-
当
b是B和i可以自动加宽到float时,为什么不选择f(float, B)类型? -
@thatotherguy:由于从
int和long到float的转换可能是有损的,因此对于一种语言来说,将数字类型的“精确”拟合视为更重要是有意义的而不是参考类型的精确拟合。然而,Java 的规则旨在优先考虑简单性而不是明智的极端情况行为,其效果是将long类型的值传递给Math.round()将产生int类型的值。 -
@RafikBouloudene:如果存在一个重载,其中 every 参数与传递的值匹配或优于任何替代值,则将使用它。在您的双参数示例中,第一个重载对第二个参数的匹配不如第二个,第二个重载对第一个参数的匹配不如第一个。
标签: java