Java 8接口多继承场景下的变量冲突解决规则是什么?
Java 8接口多继承时的成员变量冲突解决规则
咱们先把核心前提摆出来:Java 8里接口的成员变量,不管你写不写修饰符,本质都是**public static final的常量**——这是理解变量冲突规则的关键,和默认方法的冲突逻辑完全不是一回事。
冲突触发场景
当一个类实现了多个接口(或者继承的父类+实现的接口)中存在同名的成员变量时,如果你直接在类中引用这个变量名,编译器会直接抛出reference to [变量名] is ambiguous的错误,就像你遇到的temp变量冲突那样:
/MyClass.java:28: error: reference to temp is ambiguous
System.out.println(temp);
^ both variable temp in B and variable temp in C match
为什么会这样?
因为接口的成员变量是静态常量,不存在“覆盖”的说法——每个接口的同名变量都是独立的常量,编译器没法自动帮你选择哪一个,不像默认方法有优先级规则(比如类的实现优先、最近的父接口优先,或者显式指定)。
解决办法
唯一的解决方式就是显式指定变量所属的接口,直接通过接口名来访问:
// 明确调用接口B的temp常量 System.out.println(B.temp); // 或者明确调用接口C的temp常量 System.out.println(C.temp);
和方法冲突规则的区别
顺便提一句,默认方法的冲突可以通过重写方法、或者用接口名.super.方法名()的方式指定调用哪个接口的默认实现,但成员变量不行——因为它们是静态常量,从设计上就是属于各自接口的,不存在继承覆盖的逻辑,必须显式指定来源。
内容的提问来源于stack exchange,提问作者Sajani
相关产品推荐
相关产品推荐

