akj*_*ain 7 java overriding overloading interface
在"The Java™Programming Language,Fourth Edition"中,Ken Arnold,James Gosling,David Holmes提到:
段落:(4.3.2) "同样,如果一个接口继承了多个具有相同签名的方法,或者一个类实现了包含具有相同签名的方法的不同接口,则只有一个这样的方法.该方法的实现最终由实现接口的类定义,并且没有歧义.如果方法具有相同的签名但返回类型不同,则其中一个返回类型必须是所有其他类型的子类型,否则编译时错误实现必须定义一个返回该公共子类型的方法."
任何人都可以给我一些示例代码来证明上段的要点吗?
我试着编写代码并测试提到的但是我得到编译时错误,子接口隐藏了基本接口方法,所以只能实现子接口方法.
提前致谢.-Arun
interface A {
void method();
Object returnMethod();
}
interface B {
void method();
B returnMethod();
}
class Impl implements A,B
{
void method() { }
B returnMethod() { }
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,Impl.method()实现两者A.method()和B.method()同时Impl.returnMethod()返回a B,这是一个孩子Object,因此也履行A.returnMethod()合同.后者是否需要一个返回类型,它不是B.returnMethod()一个comile错误的返回类型的父类,因为没有这样的实现可能存在Impl.
下面两个接口methodA()在参数(无)和返回类型(int)方面的定义相同。底部的实现类定义了具有此精确签名的单个方法。由于它符合两个接口,因此不会有任何问题 - 通过 InterfaceA 或 InterfaceB 类型的引用进行的任何调用都将被分派到此实现。
第二个methodB()定义为返回 中的任何子类型Number(或其Number本身)InterfaceA。InterfaceB定义methodB()为返回一个Integer的子类型Number。实现类实际上实现了 的方法,因此遵守和Integer的约定。这里也没有问题。然而,被注释掉的被实现为返回 a 的情况是行不通的:虽然它会满足 的合同,但它会与(需要一个)发生冲突。InterfaceAInterfaceBmethodB()DoubleInterfaceAInterfaceBInteger
如果InterfaceA和InterfaceB还为 a 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;
// }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12718 次 |
| 最近记录: |