Java继承2个接口(interface),方法相同

标签 java inheritance

在以下代码片段中,第一个代码片段无法编译,但第二个代码片段可以编译。为什么?有什么区别?

1.

public class test {
    static interface I1 { I1 m(); }

    static interface I2 { I2 m(); }

    static interface I12 extends I1,I2 { 
    public I12 m();
    }



}

2.

public class test {
    static interface I1 { I1 m(); }

    static interface I2 { I2 m(); }

    static class I12 implements I1,I2 { 
           public I12 m(){
                return null;
           }
    }
}

最佳答案

在 Java 1.4 或更早版本中,两个代码片段都应该无法编译。在 1.5 或更高版本中,两个版本都应该可以编译。

如果重写 Java 1.4 中的方法,则必须提供与基类方法完全相同的返回类型。

这个限制在Java 1.5及更高版本中被取消,在这里你可以提供一个继承自基类方法的返回类型的返回类型。

这是有道理的,而且很有用。如果您有:

I1 x = new I12Impl();

那么你所知道的就是 x.m() 返回一个 I1。

但是如果您有更多信息:

I12 x = new I12Impl();

那么您就知道 x.m() 返回一个 I12(这也是一个 I1)。

这有时会很方便(例如,您可以在调用 x.m() 时避免沮丧)

关于Java继承2个接口(interface),方法相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9714880/

相关文章:

c++ - 父类默认构造函数由用户输入然后通过继承 - C++

python - 在 Python2 中,如何在不明确要求最终用户包含它的情况下强制子类方法调用父方法?

java - mysql数据库中特定列增量

java - 我不明白为什么 DrJava 不会输出 Unicode 符号

java - 在JAVA中删除具有扩展名的文件

c++ - 使用从模板化基类继承的成员变量 (C++)

java - 一般应用枚举成员或方法

java - Spring hibernate ManyToMany 具有额外的字段

java - MongoDB 使用 Spring Data Mongo 在集合中自动递增 Integer Id

c++ - 如何为抽象类创建二维数组