我有两个界面:
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()
?
答案 0 :(得分:8)
Java允许您将协变返回类型用于覆盖方法。
这意味着重写方法可以返回在重写方法上声明的类型的子类型。
在这种情况下,String
与Object
是协变的;由于所有String
也是Object
,因此它是实现O.m1()
和 O.m2()
的合适返回类型。
但是在一个类中不能有两个具有相同签名的方法(返回类型不是签名的一部分)。因此,当返回类型兼容时,您最多只能实现1,如下所示。 (如果它们不兼容,则会出现编译器错误)。
答案 1 :(得分:0)
String
是Object
类的实例。因此,当您实现接口方法时,可以更改类型转换。只有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