变量的歧义而不是方法的歧义
Ambiguity for Variable but not for Method
我们有一个 interface
和 class
没有关系,每个方法都有相同的签名。这些可能与可以正常编译的 class 有关。
interface A {
void test();
}
class B {
public void test() {
System.out.println("Test");
}
}
public class MultipleLevelInheritance extends B implements A {
public static void main(String[] args) {
new MultipleLevelInheritance().test();
}
}
但是当我们对 a 变量做同样的事情时,它会导致歧义。
interface A {
int a = 10;
}
class B {
public static int a = 9;
}
public class MultipleLevelInheritance extends B implements A {
public static void main(String[] args) {
System.out.println(a); //The field a is ambiguous
}
}
即使我们在 B
中将 a
保持为 final,它仍然会导致错误。为什么对方法有效而对变量无效?
你的 class MultipleLevelInheritance 正在实现一个接口并扩展了一个 class,并且两者具有相同的 属性 名称 (a),当你在 MultipleLevelInheritance 中调用 a 时,Java 无法确定变量是指 A.a 还是 B.a。你只需要给它加上前缀。
当你实现一个接口时,所有变量都在class中继承。所以,当你扩展一个class并实现接口时,它会有两个变量a的声明。因此,您遇到了歧义错误。
但是说到方法,当你实现接口的时候,期望你提供接口中定义的方法的实现。在您的示例中,此实现由 class B 提供。因此没有错误。
我们有一个 interface
和 class
没有关系,每个方法都有相同的签名。这些可能与可以正常编译的 class 有关。
interface A {
void test();
}
class B {
public void test() {
System.out.println("Test");
}
}
public class MultipleLevelInheritance extends B implements A {
public static void main(String[] args) {
new MultipleLevelInheritance().test();
}
}
但是当我们对 a 变量做同样的事情时,它会导致歧义。
interface A {
int a = 10;
}
class B {
public static int a = 9;
}
public class MultipleLevelInheritance extends B implements A {
public static void main(String[] args) {
System.out.println(a); //The field a is ambiguous
}
}
即使我们在 B
中将 a
保持为 final,它仍然会导致错误。为什么对方法有效而对变量无效?
你的 class MultipleLevelInheritance 正在实现一个接口并扩展了一个 class,并且两者具有相同的 属性 名称 (a),当你在 MultipleLevelInheritance 中调用 a 时,Java 无法确定变量是指 A.a 还是 B.a。你只需要给它加上前缀。
当你实现一个接口时,所有变量都在class中继承。所以,当你扩展一个class并实现接口时,它会有两个变量a的声明。因此,您遇到了歧义错误。
但是说到方法,当你实现接口的时候,期望你提供接口中定义的方法的实现。在您的示例中,此实现由 class B 提供。因此没有错误。