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

可能以下内容无法完成(我收到编译错误:“inheritance的方法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,它将inheritanceA和B(假设某些框架需要C,它们都是A的一个实例)和B)。

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

谢谢!

使方法公开

 public class C extends A implements B { //trying to override doSomthing... public int myMethod(int x) { return doSomthingElse(x); } } 

接口方法总是public

或者只使用合成而不是inheritance

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

 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 } 

编译器正在从AinheritanceC的doSomething() ,它是一个包私有的,作为B中公共的实现 。 这就是它抱怨的原因 –

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

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

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

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

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

现在您可能认为您使用了所有这些的default可见性,因为在ABC没有明确选择publicprivateprotected 。 但是,无论您是否明确指出,接口都使用public

简单地在C覆盖它时public方法就行了。