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

时间:2011-10-13 22:43:03

标签: 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);
    }
}

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

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

谢谢!

4 个答案:

答案 0 :(得分:27)

使方法公开

public class C extends A implements B {

    //trying to override doSomthing...

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

接口方法总是public

或仅使用合成代替继承

答案 1 :(得分:8)

方法doSomethis()在A类中是 package-private

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
}

编译器将来自A的C继承的doSomething() package-private 作为 public 中B的实现。这就是为什么它在抱怨 -

  

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

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

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

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

答案 2 :(得分:2)

这与可见性有关。您在default C中使用myMethod(无修饰符)可见性,但根据接口public,它必须为B

现在您可能认为自己使用了default种可见性,因为ABC都没有明确选择public之一1}},privateprotected。但是,无论您是否明确指出,接口都使用public

答案 3 :(得分:0)

public中覆盖方法时,只需制作方法C即可。