当前位置: 首页 > 面试题库 >

显式调用Java中的默认方法

江德润
2023-03-14
问题内容

Java 8引入了默认方法,以提供扩展接口的功能,而无需修改现有的实现。

我想知道当由于不同接口中的默认实现冲突而导致该方法的默认实现被重写或不可用时,是否可以显式调用该方法的默认实现。

interface A {
    default void foo() {
        System.out.println("A.foo");
    }
}

class B implements A {
    @Override
    public void foo() {
        System.out.println("B.foo");
    }
    public void afoo() {
        // how to invoke A.foo() here?
    }
}

考虑上面的代码,你将如何A.foo()从B类的方法调用?


问题答案:

按照这篇文章,你在界面访问默认方法A使用

A.super.foo();

这可用于如下(假设接口A和C两个有默认的方法foo())

public class ChildClass implements A, C {
    @Override    
    public void foo() {
       //you could completely override the default implementations
       doSomethingElse();
       //or manage conflicts between the same method foo() in both A and C
       A.super.foo();
    }
    public void bah() {
       A.super.foo(); //original foo() from A accessed
       C.super.foo(); //original foo() from C accessed
    }
}

A并且C可以同时具有.foo()方法,可以选择特定的默认实现,也可以将一个(或两个)用作新foo()方法的一部分。你也可以使用相同的语法在实现类中的其他方法中访问默认版本。



 类似资料:
  • 问题内容: 由于Java 8接口可能具有默认方法。我知道如何从实现方法中显式调用该方法,即(请参阅在Java中显式调用默认方法) 但是,如何在代理服务器上使用反射来 显式 调用默认方法? 例: 编辑: 我知道在我如何反省地调用Java 8默认方法中 提出了类似的问题,但这由于两个原因未能解决我的问题: 在提到的问题,旨在就如何通过反射调用它 一般 -所以默认和覆盖方法没有区别制成-这很简单,你只需

  • 我试图使用以下代码理解Java接口中的默认方法,但我无法编译它: 编译器生成了以下输出: 我无法理解这些错误。我如何更正代码中的问题?

  • Java8在接口上引入了默认方法,为collections接口的实现提供向下兼容,以避免遗留库上的MethodNotFound错误。 也就是说,具有Java7实现List的库不会实现stream()方法。如果Java8代码使用这个库,默认实现提供了一个后退。 我在实践中看到的是,许多开发人员过度使用这个特性,以类似scala特性的风格来模拟混合和多重继承。 我担心的一个问题是,这种编程风格模糊了接

  • 我试图添加一个带有默认值的请求参数,但是我希望默认值是登录的用户名。 我有一个方法getUsername(),它返回当前用户的名称,但我不能将注释的值设置为方法调用(或类属性)。这是我的方法: 我可以使RequestParam不是必需的,并在为null时填充它——但这感觉不是很优雅(或者说是spring风格)。还有其他方法可以做到这一点吗?

  • 本文向大家介绍elementui的默认样式修改方法,包括了elementui的默认样式修改方法的使用技巧和注意事项,需要的朋友参考一下 今天用element ui ,做了个消息提示,发现提示的位置总是在上面,如图: 可是我想让提示的位置到下面来,该怎么办? 最后还是看了官方的api 原来有个自定义样式属性 customClass 设置下就好了 js代码 css代码 效果图 以上这篇elementu

  • 问题内容: 我刚刚发现了此功能。 使用“ @interface”语法声明接口可让您输入默认值。 对我来说这是新事物。该默认值应该如何使用。 我找不到对此的引用,因为Java 1.5中“ @”添加之前,www充满了Java接口文档(是.5还是.4中的?) 编辑 感谢您的回答(我已经有点接近“注释”了,因为我已经使用了标签):P 我知道我应该在多年前阅读该文件!!! 许多API需要大量样板代码。 对于