在以下代码片段中,第一个代码片段无法编译,但第二个代码片段可以编译。为什么?有什么区别?
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/