重写JAVA中的超类方法

重写JAVA中的超类方法,java,Java,超级级 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.")

超级级

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;

要重写该方法,返回类型应相同

将子类中的void替换为boolean

超级级

public class A{
    public boolean close(){
        ....
    }
}
儿童班

public class B extends A implements Closeable{
    @Override
    public boolean close() throws IOException {
        throw new UnsupportedOperationException("Not supported yet."); 
    }
}

重写的方法必须具有与超级类方法相同的签名:

public class B extends A {
    @Override
    public boolean close() {
        throw new UnsupportedOperationException("Not supported yet.");
        // We'll never reach that point
        return false;
    }
}

问题是这个类不能实现Closeable,因为方法签名不能只因返回类型而不同。由于无法更改父级的close方法的签名,因此无法通过继承来解决此问题。将B改为a的包装类。然后B可以实现Closeable并将所有其他方法调用转发到A的内部实例。

您自己回答了这个问题

父类中的close方法应始终与子类中的返回类型具有相同或兼容的返回类型

因此,您必须:

更改中close方法的返回类型 更改B中close方法的返回类型
可以@Override具有不同返回类型的方法,有关更多信息,请参阅-

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


我的建议是重新构造您的代码,或者更改类A中的close return类型以匹配接口,或者创建一个新的类来实现您的Closable接口,因为同一个类中不能存在具有相同名称和参数列表的两个方法。如果不改变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 void close() {
    a.close();
}
因为这打破了A和B之间的继承关系,所以它不是一个真正的解决方案。但是如果这不重要,你可以在B中的A中添加方法。假设有一个方法叫做someMethod,你可以像这样在B中实现这个方法

public void someMethod() {
    a.someMethod();
}

由于您不能更改父类,因此无法通过继承来解决此问题。
将A设为B的私有字段,并在B中为A的任何方法创建包装器。

将B中的返回类型更改为boolean。如果要重写方法,其签名必须相等,也就是说,方法的名称以及参数的数量和类型必须相同,返回类型必须是协变的,即相同的或重写类型的子类-在您的情况下,void对boolean不协变。如果您想从类B中的类a扩展方法,您需要确保签名匹配。,如果没有它,您将有不同的方法更改A,因此close的签名与Closeable.close的签名匹配。您拥有Aclass的所有权吗?不,我没有类A。您的类B不会编译,因为return是不可访问的语句。我刚刚添加了那一行,您还必须使用条件语句。您还必须使用条件语句。-什么意思?没有需要的条件语句。这不起作用。由于可关闭接口方法签名是public void close抛出IOException,当在子类中实现时,它与超类的IOException冲突。@GautamKumar也许你应该在你的问题中提到可关闭接口签名。父类的close方法不能更改。如果你不能更改父类的方法,你就不能实现它Closeable,因为你不能有只因返回类型不同而不同的重载。我已经知道这是一个错误的答案,甚至没有编译,我是stackoverflow的新手,所以你能停下来投票否决它吗?那没用。
public void someMethod() {
    a.someMethod();
}