gpt4 book ai didi

java - Java 如何处理可能有歧义的方法调用?

转载 作者:行者123 更新时间:2023-11-30 07:46:00 24 4
gpt4 key购买 nike

在尝试使用具有多个参数的模棱两可的方法调用时,我注意到它通常并不像我预期的那样模棱两可,这导致了一些我不太理解的奇怪行为。

例如,具有以下继承结构:

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 中如何确定具有多个参数的准模糊方法调用?

最佳答案

阅读 choosing the most specific method 上的 Java 语言规范一章,请注意以下声明:

One applicable method m1 is more specific than another applicable method m2, for an invocation with argument expressions e1, ..., ek, if ...

...m2 is not generic, and m1 and m2 are applicable by strict or loose invocation, and where m1 has formal parameter types S1, ..., Sn and m2 has formal parameter types T1, ..., Tn, the type Si is more specific than Ti for argument ei for all i (1 ≤ i ≤ n, n = k).

这基本上意味着给定两个(非可变参数)可以匹配方法调用的方法签名,编译器将选择更具体的方法,并且更具体的方法是每个参数比(即与另一个签名中的相应参数相同的类或子类(为简单起见,此处忽略泛型)。

因此,例如当您有 (A,A,B) 和 (A,A,C) 时,后者更具体,因为 A = A 并且 C 是 B 的子类,因此选择是明确且明确的.

但是当你有 (A,A,B) 和 (A,C,A) 时,前者不能更具体,因为 C 是 A 的子类,但后者也不能更具体,因为B 是 A 的子类。因此,存在歧义。

关于java - Java 如何处理可能有歧义的方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51124345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com