我完全不知道为什么那行不通:
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 错误消息(它也无法处理 Lamdas,所以也许 Mars 还没有完全准备好 Java 8)?
我可以通过让 SpecialTestImpl
直接实现 Test
(这会产生一个警告,因为它是不必要的)或覆盖 TestImpl
中的方法来修复它(出于同样的原因会产生警告)。
那么为什么我不能调用 super 方法呢?
我的猜测是因为如果我能够直接调用 Test.super.doMagic()
,在 TestImpl
中实现该方法会破坏 SpecialTestImpl 的 API
即使它不应该。但如果我让 SpecialTestImpl
实现 Test
并以这种方式调用默认方法,情况也是如此。
最佳答案
这不是 Eclipse 错误,而是预期的行为。只需使用 super.doMagic();
,它工作正常。您不能调用 Test.super.doMagic()
,因为稍后可以在 TestImpl
父类(super class)中重新实现 doMagic()
。在这种情况下,TestImpl
实现必须完全覆盖 Test
实现,使其无法访问。
关于java - 使用祖 parent 接口(interface)的默认方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32606652/