可能以下内容无法完成(我收到编译错误:“继承的方法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的实例。
如果没有,你会如何解决这个问题?
谢谢!
答案 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
种可见性,因为A
,B
和C
都没有明确选择public
之一1}},private
或protected
。但是,无论您是否明确指出,接口都使用public
。
答案 3 :(得分:0)
在public
中覆盖方法时,只需制作方法C
即可。