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

rap*_*apt 23 java syntax specifications

可能以下内容无法完成(我收到编译错误:"继承的方法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);
    }
}
Run Code Online (Sandbox Code Playgroud)

假设我被允许改变A和B,我的问题是我可以以某种方式定义C,它将继承A和B(假设某些框架需要C,它们都是A的一个实例)和B).

或者如果没有,你会如何解决这个问题?

谢谢!

rat*_*eak 27

使方法公开

public class C extends A implements B {

    //trying to override doSomthing...

    public int myMethod(int x) {
        return doSomthingElse(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

接口方法总是如此 public

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


Bhe*_*ung 8

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

public class A {
    int doSomthing(int x) { // this is package-private
        return x;
    }
}
Run Code Online (Sandbox Code Playgroud)

但它在界面B中是公开的:

public interface B {
    int doSomthing(int x); // this here is public by default
}
Run Code Online (Sandbox Code Playgroud)

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

"继承的方法A.doSomthing(int)无法隐藏B中的公共抽象方法"

因为,在覆盖方法时,您无法缩小方法的访问级别.

解决方案很简单,在C级 -

@Override
public int doSomthing(int x) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)