Java:扩展一个类并实现一个具有相同方法的接口

2022-09-01 18:56:55

可能以下操作无法完成(我收到编译错误:“继承的方法A.doSomthing(int)无法隐藏B中的公共抽象方法”):

public class A {
    int doSomthing(int x) {
        return x;
    }
}

public interface B {
    int doSomthing(int x);
}

public class C extends A implements B {

    //trying to override doSomthing...

    int doSomthing(int x) {
        return doSomthingElse(x);
    }
}

假设我既不能改变A也不能改变B,我的问题是,我是否可以以某种方式定义C,使其同时继承A和B(假设某些框架需要C既是A又是B的实例)。

或者如果没有,您将如何解决这个问题?

谢谢!


答案 1

公开该方法

public class C extends A implements B {

    //trying to override doSomthing...

    public int myMethod(int x) {
        return doSomthingElse(x);
    }
}

接口方法始终public

或者只是使用组合而不是继承


答案 2

该方法在类 A 中是包私有的doSomethis()

public class A {
    int doSomthing(int x) { // this is package-private
        return x;
    }
}

但它在接口 B 中是公开的:

public interface B {
    int doSomthing(int x); // this here is public by default
}

编译器采用 C 从 A 继承的包私有,作为 B 中公共的 A 的实现。这就是为什么它抱怨 -doSomething()

“继承的方法A.doSomthing(int)不能隐藏B中的公共抽象方法”

因为,在重写方法时,您无法缩小方法的访问级别

解决方案很简单,在C类中 -

@Override
public int doSomthing(int x) {
    // ...
}