【发布时间】:2018-07-01 14:49:08
【问题描述】:
在玩弄具有多个参数的模棱两可的方法调用时,我注意到很多时候它实际上并不是我所期望的模棱两可,这导致了一些我不太理解的奇怪行为。
例如,具有以下继承结构:
public static class A {
}
public static class B extends A {
}
public static class C extends B {
}
并运行方法test()。
public static void test() {
test(new C(), new C(), new C());
}
由于某种原因,这两种方法不明确
public static void test(A x, A xx, B xxx) {
System.out.println("TEST 1");
}
public static void test(A x, C xx, A xxx) {
System.out.println("TEST 2");
}
但是,在第二种方法中交换最后两个参数会使那个优先。
public static void test(A x, A xx, B xxx) {
System.out.println("TEST 1");
}
public static void test(A x, A xx, C xxx) {
System.out.println("TEST 2"); //No longer ambiguous, this one is called
}
有人能解释一下这种行为吗?以及一般来说,在 Java 中如何确定具有多个参数的准模糊方法调用?
【问题讨论】:
-
我只是想指出,你所描述的不是“多重继承”,它只是一个单一的继承链。
-
@bhspencer 我的错,我删除了标签
-
我几乎可以肯定有一个副本。只需查看方法覆盖的规则即可。
-
它由 Java 语言规范 (docs.oracle.com/javase/specs/jls/se8/html/…) 的规则确定。它们又长又复杂。没有人知道他们全部。但这不是问题,因为没有人使用这种模棱两可的重载,因为它们很难正确处理。
标签: java inheritance ambiguous