以下两个接口methodA()
在参数(none)和返回类型(int)方面定义相同。底部的实现类定义了一个具有这个确切签名的方法。由于它同时符合这两个接口,因此您不会遇到任何问题 - 通过 InterfaceA 或 InterfaceB 类型的引用进行的任何调用都将被分派到此实现。
第二个被定义methodB()
为返回. 定义为返回一个which 是 的子类型。实现类实际上实现了 with 的方法,因此符合and的约定。这里也没有问题。注释掉的被实施为返回 a然而的情况是行不通的:虽然它会满足 的合同,但它会与(要求 a )冲突。Number
Number
InterfaceA
InterfaceB
methodB()
Integer
Number
Integer
InterfaceA
InterfaceB
methodB()
Double
InterfaceA
InterfaceB
Integer
如果InterfaceA
并且还为(在示例中注释掉的InterfaceB
)指定(不同的)合约,这将是矛盾的,并会产生编译器错误。methodC()
Java 中不允许同时实现这两个签名(仅在返回类型上有所不同)。
如果要向方法添加任何参数,上述规则也适用。为简单起见,我将其排除在示例之外。
public interface InterfaceA {
public int methodA();
public Number methodB();
// public int methodC(); // conflicting return type
}
public interface InterfaceB {
public int methodA();
public Integer methodB();
// public String methodC(); // conflicting return type
}
public class ImplementationOfAandB implements InterfaceA, InterfaceB {
public int methodA() {
return 0;
}
public Integer methodB() {
return null;
}
// This would NOT work:
// public Double methodB() {
// return null;
// }
}