在以下两个接口methodA()
根据参数(无)和返回类型(int)进行了相同的定义。底部的实现类定义了一个具有这个确切签名的单一方法。因为它符合两个接口,所以你不会遇到任何问题 - 通过类型为InterfaceA或InterfaceB的引用所做的任何调用都将分派给此实现。
第二methodB()
被定义为InterfaceA
返回的Number
(或Number
本身)的任何亚型。 InterfaceB
将methodB()
定义为返回Integer
,其是Number
的子类型。实现类实际上实现了Integer
的方法,因此符合01和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;
// }
}
你能显示代码? – 2009-05-18 12:59:49
发布你的代码和你的编译器错误的家伙......至少给我们一些(a)重现问题;和(b)从那里出发。 – corlettk 2009-05-18 13:00:44
每个人我都很抱歉 - 我试图用j2sdk1.4.2_08测试上面提到的段落中提到的内容 - 我没有意识到这本书是为JDK1.5编写的 所以这意味着如果你编译代码片段通过使用JDK1.4的“Daniel Schneller”,你将在ImplementationOfAandB中得到一个“ImplementationOfAandB.java:17:methodB()”,但不能在InterfaceA中实现methodB();尝试使用不兼容的返回类型“编译错误,而使用JDK1.5它只运行精细。 – akjain 2009-05-18 14:24:50