首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JAVA中重写超类方法

在JAVA中重写超类方法
EN

Stack Overflow用户
提问于 2016-07-22 16:56:23
回答 6查看 915关注 0票数 0

超类

代码语言:javascript
复制
public class A{
    public boolean close(){
        ....
    }
}

子类:

代码语言:javascript
复制
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不同:

代码语言:javascript
复制
public void close() throws IOException;
EN

回答 6

Stack Overflow用户

发布于 2016-07-22 17:36:42

因为在同一个类中不能存在具有相同名称和参数列表的两个方法。如果不更改类A,这是不可能的。

我认为最好的方法是先将close方法的名称更改为其他名称。这是因为人们不能仅仅通过查看单词close来推断返回值的含义。布尔值是否表示事物是否成功关闭?或者这意味着什么呢?

如果返回值true表示已成功关闭,而false表示未成功关闭,请更改方法名以使其传达此信息!我建议您将其更改为closeAndReturnSuccessStatus或类似的名称。

然后,您可以这样在Closeable中实现该方法:

代码语言:javascript
复制
public void close() {
    if (!closeAndReturnSuccessStatus()) {
        // throw an exception or something, since this means that it isn't closed.
    }
}

编辑:

我刚才听到你说你不拥有A类,所以这可能会起作用:

B中存储A的实例,而不是继承。

代码语言:javascript
复制
public class B {
    private A a = someValue;
}

并像这样实现接口:

代码语言:javascript
复制
public void close() {
    a.close();
}

因为这打破了AB之间的继承,所以它不是一个真正的解决方案。但如果这无关紧要,您可以在B中的A中添加方法。假设有一个名为someMethod的方法,您可以像这样在B中实现该方法;

代码语言:javascript
复制
public void someMethod() {
    a.someMethod();
}
票数 1
EN

Stack Overflow用户

发布于 2016-07-22 17:05:00

不能有两个同名的方法接受相同的参数,但返回不同的类型。

我的建议是重构您的代码,可能更改类A中的close返回类型以匹配接口,或者可能使A实现Closable接口

票数 0
EN

Stack Overflow用户

发布于 2016-07-22 17:40:19

因为你不能改变你的父类,所以你不能通过继承来解决这个问题。将A设为B的私有字段,并在B中为A所需的任何方法创建一个包装器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38522245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档