Java使用相同的方法继承2个接口

时间:2012-03-15 06:21:29

标签: 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;
           }
    }
}

2 个答案:

答案 0 :(得分:2)

在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()时避免向下转换)

答案 1 :(得分:1)

允许该类实现多个接口,但是当接口扩展多个接口并且两个父接口具有相同的命名方法时,除了没有任何问题之外,它还会产生错误。这是它在IDE中没有显示错误的唯一原因因为IDE(eclipse)有自己的编译器而且不使用javac进行编译。