Java:扩展类并实现具有相同方法的接口
可能无法执行以下操作(我收到一个编译错误:“继承的方法a.doSomthing(int)无法在B中隐藏公共抽象方法”): 假设我既不允许更改A也不允许更改B,我的问题是,我是否可以以某种方式定义C,使其同时继承A和B(假设某些框架要求C同时是A和B的实例) 如果不是,你会如何解决这个问题 谢谢 公开该方法Java:扩展类并实现具有相同方法的接口,java,syntax,specifications,Java,Syntax,Specifications,可能无法执行以下操作(我收到一个编译错误:“继承的方法a.doSomthing(int)无法在B中隐藏公共抽象方法”): 假设我既不允许更改A也不允许更改B,我的问题是,我是否可以以某种方式定义C,使其同时继承A和B(假设某些框架要求C同时是A和B的实例) 如果不是,你会如何解决这个问题 谢谢 公开该方法 public class C extends A implements B { //trying to override doSomthing... public int
public class C extends A implements B {
//trying to override doSomthing...
public int myMethod(int x) {
return doSomthingElse(x);
}
}
接口方法总是public
或者只使用组合而不是继承这与可见性有关。对于
myMethod
,您正在使用C
中的default
(无修改器)可见性,但根据界面B
,它需要是public
现在,您可能会认为您对它们都使用了
默认
可见性,因为在A
、B
和C
中,您都没有明确选择公共
、私有
或受保护
。但是,无论您是否明确表示,接口都使用public
。在C
中重写方法时,只需将方法public
即可。方法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
}
编译器将C从包私有的A继承的doSomething()
作为B中公共包的实现。这就是它抱怨的原因-
“继承的方法A.doSomthing(int)无法在B中隐藏公共抽象方法”
因为,在重写方法时,不能缩小方法的访问级别
在C类中,解决方案很简单-
@Override
public int doSomthing(int x) {
// ...
}
请报告您的错误。这里没有什么明显的错误,除了如果您使用1.6,可能缺少@Overrides@b参数,没有
public
,而override只是一个可选的麻烦。一个变量既可以是类实例,也可以继承接口吗?在您的示例中,它类似于newc()实现X
,假设X是interface@Vadorequest实现或扩展是在类级别而不是实例级别完成的。要实现X,您需要将其添加到接口列表中:public类C扩展了A实现了B,X{…}
@Override
public int doSomthing(int x) {
// ...
}