覆盖JAVA中的超类方法

时间:2016-07-22 08:56:23

标签: 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."); 
    }
}

在B类中实现Closeable接口的Close方法会产生错误,因为返回类型void与父类的返回类型boolean不兼容。 close类的签名在父类和接口的签名上是不同的。我该如何解决这个问题?

更新

Closeable接口的方法close()返回类型与A类不同:

public void close() throws IOException;

6 个答案:

答案 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();
}

由于这会破坏AB之间的继承,因此它并不是真正的解决方案。但是,如果这不重要,您可以在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()方法应始终具有与子类中相同的返回类型(或兼容的类型)。

所以你要么:

  • 更改A
  • close()方法的返回类型
  • 更改B
  • 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(){
        ....
    }
}