两个接口中具有相同签名但返回类型不同的方法

时间:2018-09-08 19:40:54

标签: java

我有两个界面:

interface S {
    public String m1();
}

interface O {
    public Object m1();
}

我决定在类Test中同时实现O和S:

class Test implements O, S {

}

我的问题:

为什么我只能实现方法public String m1()而不能实现另一个方法? 其次,为什么我不能实现public Object m1()而不是public String m1()

3 个答案:

答案 0 :(得分:8)

Java允许您将协变返回类型用于覆盖方法。

这意味着重写方法可以返回在重写方法上声明的类型的子类型。

在这种情况下,StringObject是协变的;由于所有String也是Object,因此它是实现O.m1() O.m2()的合适返回类型。

但是在一个类中不能有两个具有相同签名的方法(返回类型不是签名的一部分)。因此,当返回类型兼容时,您最多只能实现1,如下所示。 (如果它们不兼容,则会出现编译器错误)。

答案 1 :(得分:0)

StringObject类的实例。因此,当您实现接口方法时,可以更改类型转换。只有int,double..and others之类的原始类型不能进行转换。

答案 2 :(得分:0)

您可以使用此

class Test implements O, S {

    O  _o = new O() {
              @Override
              public Object m1(){
                return new Object();
              }
           };

    @Override
    public String m1(){
      return "";
    }
}

Test t = new Test();
t.m1();// m1 from s
t._o.m1();// m1 from O