众所周知,如果在一次满足多个重载方法时进行调用,则会选择参数最具体的方法。例子:
class Test {
void t(Object o) {System.out.println("Object");}
void t(Integer i) {System.out.println("Integer");}
public static void main(String[] s) {
new Test().t(null);
}
}
在这种情况下,它将产生它应该产生的结果——整数(整数从对象继承了 1 级)。如果再添加 3 个带有 String 参数的方法,就会出错,因为 Integer 和 String 的继承级别为 1。现在让我们看另一个例子:
class B1 {}
class E1 extends B1 {}
class EE1 extends E1 {}
class B2 {}
class Test {
void t(B2 e) {System.out.println("B2");}
void t(EE1 e) {System.out.println("EE1");}
public static void main(String[] s) {
new Test().t(null);
}
}
如果您尝试运行它,将发生错误,无法选择最具体的类型!尽管在 EE1 的情况下有 3 级继承,而 B2 有 1 级继承。最后一个例子:
class B1 {}
class E1 extends B1 {}
class EE1 extends E1 {}
class Test {
void t(E1 e) {System.out.println("E1");}
void t(EE1 e) {System.out.println("EE1");}
public static void main(String[] s) {
new Test().t(null);
}
}
工作正常。由 EE1 发行。这种行为的原因是什么?为什么分支继承不根据与对象的距离来确定特异性?
您只能在基类和继承人之间做出选择(可以通过另一个类)以支持继承人。不可能在来自不同“分支”的任何2 个继承人之间做出选择。
添加后你对example 1并不感到意外
String,它Integer继承自Number并且是2nd order的继承人,按照你的逻辑,应该选择它。虽然这样的行为,说得客气一点,很奇怪。