java - 使用祖 parent 接口(interface)的默认方法

标签 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
    }
}

这是不是一些奇怪的 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/

相关文章:

java - 使用函数式风格合并两个数组

java - ListView JavaFX中交替行左侧和右侧的图像和文本

java - 将 Android 短信对话标记为已读。 Sql 查询一次又一次执行。(错误)

java - 通过工厂实例化 EJB

android - 为什么 Android Studio 创建的 APK 比 Eclipse 创建的 APK 大?

java - IBM Worklight 版本 6.1.0,在 Win 7 上带有嵌入式 WL 开发服务器,一致的 Android 构建错误

java - ifPresent 返回一些东西 orElse

java - JPA:如果其他情况不适用于查询

java - 在 cassandra 中导出/导入数据

eclipse - Eclipse 中的资源泄漏问题?