我完全不知道为什么这行不通:
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()
,因为稍后可以在doMagic()
超类中重新实现TestImpl
。在这种情况下,TestImpl
实现必须完全遮盖Test
实现,使其无法访问。