我完全不明白为什么这样做行不通:
这是一条奇怪的Eclipse错误消息(Eclipse也无法处理Lambda表达式,所以Mars或许还没有完全准备好Java 8)。您可以通过让“SpecialTestImpl”直接实现“Test”接口来解决此问题(这会产生警告,因为它是不必要的),或者覆盖“TestImpl”中的方法(由于相同的原因,这也会产生警告)。
那么为什么我不能调用超级方法呢?
我的猜测是,因为如果我能够直接调用“Test.super.doMagic()”,则在“TestImpl”中实现该方法将会破坏“SpecialTestImpl”的API,尽管事实并非如此。但是,如果让“SpecialTestImpl”实现“Test”接口并以此方式调用默认方法,情况仍然如此。
interface Test {
default void doMagic() {
System.out.println("Abracadabra");
}
}
class TestImpl implements Test {
}
class SpecialTestImpl extends TestImpl {
public void doMagic() {
Test.super.doMagic(); // Error: No enclosing instance of the type Test is accessible in scope
}
}
这是一条奇怪的Eclipse错误消息(Eclipse也无法处理Lambda表达式,所以Mars或许还没有完全准备好Java 8)。您可以通过让“SpecialTestImpl”直接实现“Test”接口来解决此问题(这会产生警告,因为它是不必要的),或者覆盖“TestImpl”中的方法(由于相同的原因,这也会产生警告)。
那么为什么我不能调用超级方法呢?
我的猜测是,因为如果我能够直接调用“Test.super.doMagic()”,则在“TestImpl”中实现该方法将会破坏“SpecialTestImpl”的API,尽管事实并非如此。但是,如果让“SpecialTestImpl”实现“Test”接口并以此方式调用默认方法,情况仍然如此。
doMagic
不是静态方法,因此您无法静态地调用它。 - Buhake Sindi