【发布时间】:2019-09-23 15:54:01
【问题描述】:
我正在尝试了解默认方法如何在各种情况下处理钻石问题。
而且,这是我无法理解的场景之一。
以下是描述,
1. 带有默认方法的接口method()
2. 带有方法的抽象类method()
3. 实现上述接口并扩展抽象类的具体类。
interface Interface {
default void method() {
System.out.println("Interface method");
}
}
abstract class AbstractClass {
void method() {
System.out.println("Abstract class method");
}
}
// Concrete class definition first starts
public class ConcreteClass extends AbstractClass implements Interface {
@Override
public void method() {
super.method();
}
public static void main(String[] args) {
Interface test = new ConcreteClass();
test.method();
}
}
// Concrete class definition first ends
// Concrete class definition Second starts
public class ConcreteClass extends AbstractClass implements Interface {
public static void main(String[] args) {
Interface test = new ConcreteClass();
test.method();
}
}
// Concrete class definition Second ends
我的查询,
1. 为什么定义首先总是以“抽象类方法”的形式输出,即使我使用接口类型作为具体的类对象?
2. 为什么定义第二个不编译?
如果编译器首先在定义中使用抽象类实现,那么它应该能够识别出它将始终在第二个定义中使用抽象类实现。
这种行为让我很困惑,非常感谢任何帮助。 否则,我越深入研究,它就越混乱。
编辑 1:
第二个定义的编译错误是“继承的方法AbstractClass.method()不能隐藏接口中的公共抽象方法”
【问题讨论】:
-
(1) “即使我将具体的类对象转换为接口”cast 是什么意思? (2) 你得到什么编译错误(它应该包含 why 部分的答案)?
-
添加编译错误。