我完全不知道为什么这行不通:

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实现,使其无法访问。

07-26 01:58