在下面的代码片段中,第一个不编译,但第二个编译。为什么?有什么区别?
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;
}
}
}
答案 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进行编译。