重写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();
}