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

调用具体类中超级接口的非抽象方法[duplicate]

李昱
2023-03-14

Calculator接口具有calculate抽象方法和ramdom()非抽象方法。我想使用superramdom()并在具体类CalculatorImpl中重写ramdom()。我的问题是为什么我必须这样调用Calculator.super.ramdom()?为什么super.ramdon()不工作?

public interface Calculator {

    double calculate(int a);

    default double ramdom() {
        System.out.println("Calculator ramdom");
        return Math.random();
    }

}

class CalculatorImpl implements Calculator {

    @Override
    public double calculate(int a) {
        // calling super.ramdom() will get [The method ramdom() is undefined for
        // the type Object error]
        return Calculator.super.ramdom() * a;
    }

    @Override
    public double ramdom() {
        System.out.println("CalculatorImpl ramdom");
        return 0;
    }

}

共有2个答案

姜增
2023-03-14

只需在CalculatorImpl中删除对ramdom的覆盖即可。它将隐式使用计算器中的默认实现。

class CalculatorImpl implements Calculator {

@Override
public double calculate(int a) {
    // calling super.ramdom() will get [The method ramdom() is undefined for
    // the type Object error]
    return Calculator.super.ramdom() * a;
}
/* Remove the Override and the default implementation will be used
@Override
public double ramdom() {
    System.out.println("CalculatorImpl ramdom");
    return 0;
}
*/
}

关键字super用于调用继承的类而不是实现的接口。但是这里除了隐式对象没有随机方法外,没有继承

编辑:我可能误解了你的问题。如果要覆盖并调用默认实现,请检查Sasha Salauyou提供的链接

龙高歌
2023-03-14

回答你的确切问题:当你在一个类中使用超级时...你是在“指向”它正在扩展的类;在这种情况下是Object。

但是Object没有您可以调用的随机方法。

因此,你必须明确随机性的真正来源。

 类似资料:
  • 这似乎是一个基本问题。但在采访前需要澄清。 我在抽象类中有一个非抽象方法。它的具体类重写了该方法。但我想调用父类的原始方法来调用,而不是重写方法。有什么办法吗? 据我所知,没有办法调用原始方法?

  • 我知道抽象类可能包含抽象和具体方法(即主体实现)。我的问题是:子类可以从抽象超类继承/覆盖具体方法吗?其次,它们必须以实现抽象方法的方式实现具体方法吗?

  • 问题内容: 当其中的所有方法都是具体的时,有人在声明类抽象时有一些实际的编程情况吗? 问题答案: 好吧,您可能正在使用模板方法模式,其中存在多个都具有默认实现的覆盖点,但是组合的默认实现本身不合法-任何功能实现都必须是子类。 (是的,我不喜欢模板方法模式;)

  • 我正在尝试对扩展抽象基的类进行单元测试。以下是“类似的类”,以供说明: 下面是我正在尝试的单元测试: 当我做这个测试的时候 java.lang.NullPointerException 在中 我知道自动连线的“滤水器”没有初始化。但接下来,我只想在我的单元测试中模拟抽象的“非抽象”方法。 我该如何使用EasyMock来实现这一点呢?另外,我不知道和应该做什么。

  • 当我宣布“抽象公共无效显示();”在抽象类测试中,这是创建一个全新的show()方法,还是只引用Inter接口中声明的show()方法?请澄清。

  • 问题内容: 我发现情况: 问题答案: 您同时满足这两个条件;即。一种实现是同时满足抽象类要求和接口要求。 注意,除非在另一个继承链中使用,否则不需要它。另外,将其移至抽象类定义可能很有意义。