使用祖父窗口的默认方法

Ste*_* S. 5 java eclipse java-8

我完全迷失了为什么那不起作用:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一些奇怪的Eclipse错误消息(它也无法应对Lamdas,所以也许Mars还没有完全准备好Java 8)?

我可以通过直接让SpecialTestImpl工具Test(它产生警告,因为它是不必要的)或覆盖方法来解决它(由于TestImpl相同的原因产生警告).

那么为什么我不能调用超级方法呢?

我的猜测是因为如果我能够Test.super.doMagic()直接调用,实现该方法TestImpl会破坏API,SpecialTestImpl即使它不应该.但是如果我让SpecialTestImpl实现Test并以这种方式调用默认方法也是如此.

Tag*_*eev 11

这不是Eclipse的错误,它是预期的行为.只是使用super.doMagic();,它工作正常.你不能再调用Test.super.doMagic()as,doMagic()可以在TestImpl超类中重新实现.在这种情况下,TestImpl实现必须完全影响Test实现,使其无法访问.

  • 如果`TestImpl`是一个`接口`,那么`TestImpl.super.doMagic()`是正确的... (3认同)
  • @MarkoTopolnik,确切地说!以同样的方式,你不能调用在超类中重写的超级超类的方法. (2认同)
  • 一个错过树林的情况,因为Eclipse将`TestImpl.super.doMagic()`作为该方法的标准实现(如果你问我,这确实是一个错误).:) (2认同)