超类
public class A{
public boolean close(){
....
}
}子类:
public class B extends A implements Closeable{
@Override
public void close() throws IOException {
throw new UnsupportedOperationException("Not supported yet.");
}
}在类B中实现Closeable接口的Close方法会给出错误,因为返回类型void与父类的返回类型boolean不兼容。close方法的签名在父类和接口中是不同的。如何解决此问题?
更新
Closeable接口也有方法close(),其返回类型与类A不同:
public void close() throws IOException;发布于 2016-07-22 17:36:42
因为在同一个类中不能存在具有相同名称和参数列表的两个方法。如果不更改类A,这是不可能的。
我认为最好的方法是先将close方法的名称更改为其他名称。这是因为人们不能仅仅通过查看单词close来推断返回值的含义。布尔值是否表示事物是否成功关闭?或者这意味着什么呢?
如果返回值true表示已成功关闭,而false表示未成功关闭,请更改方法名以使其传达此信息!我建议您将其更改为closeAndReturnSuccessStatus或类似的名称。
然后,您可以这样在Closeable中实现该方法:
public void close() {
if (!closeAndReturnSuccessStatus()) {
// throw an exception or something, since this means that it isn't closed.
}
}编辑:
我刚才听到你说你不拥有A类,所以这可能会起作用:
在B中存储A的实例,而不是继承。
public class B {
private A a = someValue;
}并像这样实现接口:
public void close() {
a.close();
}因为这打破了A和B之间的继承,所以它不是一个真正的解决方案。但如果这无关紧要,您可以在B中的A中添加方法。假设有一个名为someMethod的方法,您可以像这样在B中实现该方法;
public void someMethod() {
a.someMethod();
}发布于 2016-07-22 17:05:00
不能有两个同名的方法接受相同的参数,但返回不同的类型。
我的建议是重构您的代码,可能更改类A中的close返回类型以匹配接口,或者可能使A实现Closable接口
发布于 2016-07-22 17:40:19
因为你不能改变你的父类,所以你不能通过继承来解决这个问题。将A设为B的私有字段,并在B中为A所需的任何方法创建一个包装器。
https://stackoverflow.com/questions/38522245
复制相似问题