当前位置: 首页 > 知识库问答 >
问题:

调用超级接口的默认方法是可能的吗?[副本]

陈项禹
2023-03-14

假设我有两个类,AB:

class A
{
    void method()
    {
        System.out.println("a.method");
    }
}
class B extends A
{
    @Override
    void method()
    {
        System.out.println("b.method");
    }
}

在将b实例化为b之后,我可以像b.method()那样调用b的方法。我还可以使b的方法使用super.method()调用a的方法。但如果A是一个接口会怎样:

interface A
{
    default void method()
    {
        System.out.println("a.method");
    }
}
class B implements A
{
    @Override
    void method()
    {
        System.out.println("b.method");
    }
}

有什么方法可以让b的方法调用a的方法吗?

共有1个答案

洪高刚
2023-03-14

是的,你可以。使用

A.super.method();

JLS规定

如果表单为typename。超级。[TypeArguments]标识符,则:

t是立即包含方法调用的类型声明。如果T是类对象,则是编译时错误。

否则,typename表示要搜索的接口i

 类似资料:
  • 在Java8中,我有如下内容: 例如,如果A解锁或提供了对一个资源(比如数据库)的访问,而B解锁了第二个资源(另一个数据库),我认为没有办法使代码解锁A,然后B通过使用函数接口强制执行这个契约,要求调用A和B。一层深的你可以做到,但N层深的看起来就不可能了。 我打算使用lambdas来避免进行昂贵的调用,但要对我的库的用户执行语义操作顺序。 这个问题与“在Java中显式调用默认方法”并不完全相同,

  • 问题内容: 在Java 8中,我有类似以下内容: 有没有一种方法可以从ImplementsB调用默认的功能接口行为,而不必创建匿名内部类并调用该内部类? 这会有副作用(两次调用ImplementsA的方法),需要调用父级的实现,然后让子级的实现能够调用子级的默认实现,并在需要时进行一些专门化。如您所见,调用父级的实现非常简单,但是我看不到一种避免重写默认实现的方法,除非我在实现子接口的类上添加了间

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

  • 假设我有这个接口A: “类型B不能是C的超级接口;超级接口必须是接口” 如果这个类的层次结构是有效的,那么任何人现在都可以了,还是我应该反过来做?

  • 问题内容: 考虑以下情况, 在上面的例子中我得到以下输出这是 相当 期待。 我一直在阅读有关默认方法的信息, 尤其是 关于扩展包含默认方法的接口的信息 2 第二子弹:重新声明的默认方法,这使得它的抽象。 在上面的示例中,我有两个接口的默认方法具有相同的名称,并且当我实现这两个接口时,我只能实现对的引用。 我对此几乎没有疑问, 我怎样才能 到达 的方法 和 如果我不能比,为什么? 没有这种行为从本质

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