【发布时间】:2018-03-03 04:17:22
【问题描述】:
Java 解决默认方法冲突:为什么要使用 super 关键字?
我正在阅读《Core Java SE 9 for the impatient》一书。在部分
“解决默认方法冲突”,我发现解决时
默认方法冲突,使用 super 关键字。但我不
了解为什么使用super 关键字。
从此链接:https://docs.oracle.com/javase/tutorial/java/IandI/override.html
我知道super 关键字是必需的(否则程序将无法编译)。
但这似乎违反直觉。据我了解,界面
“Identified”没有超类。为什么不直接使用“return Identified.getId();”?
public interface Person {
default int getId() {
return 0;
}
}
public interface Identified {
default int getId() {
return Math.abs(hashCode());
}
}
public class Employee implements Person, Identified {
public int getId() {
return Identified.super.getId();
}
}
【问题讨论】:
-
Identified.getId()是静态的。您想返回super.getId()并使用Identified告诉编译器使用哪个冲突方法。把它想象成(Identified.super).getId() -
这实际上很令人困惑,想想看。这与
T.super.x的其他用法不一致,即将引用的对象视为T的超类的实例(参见 §15.11.2)。我认为直观地使用合格的this(如Identified.this.getId())可能更有意义,但这可能会给设计师带来更多的歧义。 -
@Radiodef 或 IMO 可以说像
super.Identified.getId()这样的话会更简洁,因为我不知道 which super。但无论哪种方式,这都是一个非常令人困惑的语法
标签: java interface multiple-inheritance