比方说,有以下几种类型:的Java 8默认方法继承
public interface Base {
default void sayHi(){
System.out.println("hi from base");
}
}
public interface Foo extends Base {
@Override
default void sayHi(){
System.out.println("hi from foo");
}
}
public interface Bar extends Base {
}
public class MyClass implements Foo, Bar {
public static void main(String[] args) {
MyClass c = new MyClass();
c.sayHi();
}
}
在这种情况下,如果main
被执行,“从富喜”被打印出来。为什么Foo
的实施优先? Bar
从Base
继承sayHi()
,因为如果MyClass
仅用于执行Bar
,那么将调用Base
实现?所以代码仍然不能编译是有意义的。此外,由于Bar
应有的Base
实施sayHi()
,为什么我不能覆盖它在MyClass
,如:
@Override
public void sayHi() {
Bar.super.sayHi();
}
试图这样做时,会出现以下错误:
坏类型修饰符在缺省超级调用方法中,sayHi()在Foo中被覆盖
@Casey什么IDE您使用的? Eclipse给出了另一个错误。 –
@JornVernee这是来自IntelliJ。 Eclipse输出了什么? – Casey
@Casey'''非法引用来自类型Base的超级方法sayHi(),无法绕过来自类型Foo''的更具体的覆盖。 –