Java接口:继承,重写和重载方法

akj*_*ain 7 java overriding overloading interface

在"The Java™Programming Language,Fourth Edition"中,Ken Arnold,James Gosling,David Holmes提到:

段落:(4.3.2) "同样,如果一个接口继承了多个具有相同签名的方法,或者一个类实现了包含具有相同签名的方法的不同接口,则只有一个这样的方法.该方法的实现最终由实现接口的类定义,并且没有歧义.如果方法具有相同的签名但返回类型不同,则其中一个返回类型必须是所有其他类型的子类型,否则编译时错误实现必须定义一个返回该公共子类型的方法."

任何人都可以给我一些示例代码来证明上段的要点吗?

我试着编写代码并测试提到的但是我得到编译时错误,子接口隐藏了基本接口方法,所以只能实现子接口方法.

提前致谢.-Arun

Dav*_*itt 8

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.

  • 不,Impl必须实现更具体的返回类型才能满足这两个接口. (3认同)

Dan*_*ler 2

下面两个接口methodA()在参数(无)和返回类型(int)方面的定义相同。底部的实现类定义了具有此精确签名的单个方法。由于它符合两个接口,因此不会有任何问题 - 通过 InterfaceA 或 InterfaceB 类型的引用进行的任何调用都将被分派到此实现。

第二个methodB()定义为返回 中的任何子类型Number(或其Number本身)InterfaceAInterfaceB定义methodB()为返回一个Integer的子类型Number。实现类实际上实现了 的方法,因此遵守和Integer的约定。这里也没有问题。然而,被注释掉的被实现为返回 a 的情况是行不通的:虽然它会满足 的合同,但它会与(需要一个)发生冲突。InterfaceAInterfaceBmethodB()DoubleInterfaceAInterfaceBInteger

如果InterfaceAInterfaceB还为 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)