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
可见性,因为在A
, B
和C
没有明确选择public
, private
或protected
。 但是,无论您是否明确指出,接口都使用public
。
简单地在C
覆盖它时public
方法就行了。