超级
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;
答案 0 :(得分:1)
由于在同一个类中不能存在具有相同名称和参数列表的两个方法。如果不更改班级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
,所以也许这会有效:
而不是继承,在A
中存储B
的实例。
public class B {
private A a = someValue;
}
并实现如下界面:
public void close() {
a.close();
}
由于这会破坏A
和B
之间的继承,因此它并不是真正的解决方案。但是,如果这不重要,您可以在A
B
中添加方法。假设有一个名为someMethod
的方法,您可以像这样在B
中实现该方法;
public void someMethod() {
a.someMethod();
}
答案 1 :(得分:0)
你不能有两个同名的方法接受相同的参数,并返回不同的类型。
我的建议是重构您的代码,可能会更改A类中的close
返回类型以匹配界面,或者可能使A实现您的Closable
界面
答案 2 :(得分:0)
由于您无法更改父类,因此无法通过继承来解决此问题。 使A成为B的私有字段,并在B中为您需要的任何A方法创建一个包装器。
答案 3 :(得分:-1)
您的重写方法必须具有与超类方法相同的签名:
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的内部实例。
答案 4 :(得分:-1)
你自己回答了这个问题。
父类的close()
方法应始终具有与子类中相同的返回类型(或兼容的类型)。
所以你要么:
close()
方法的返回类型
close()
方法的返回类型
@Override
可以使用不同的返回类型的方法,有关详细信息,请参阅this question -
答案 5 :(得分:-2)
要覆盖该方法,返回类型应相同。
在子类中将void替换为boolean。
超级
@RunWith ( SpringJUnit4ClassRunner.class )
@SpringApplicationConfiguration ( classes = MyApplication.class )
@ContextConfiguration ( classes = MockServletContext.class )
@WebAppConfiguration
儿童班
public class A{
public boolean close(){
....
}
}