![](/img/trans.png)
[英]Java 8 -Two interfaces contain default methods with the same method signature but different return types, how to override?
[英]Java - implementing multiple interfaces with same method and different return types
请考虑以下代码:
public interface A {
public A another();
}
public interface B {
public B another();
}
public interface AB extends A,B {
public AB another();
}
这导致AB
上的编译错误:
B型和A型不兼容; 两者都定义了另一个(),但具有不相关的返回类型
我已经看到了这个问题 ,并按照接受的答案中的不兼容性示例 - 即
public interface C {
public void doSomething();
}
public interface D {
public boolean doSomething();
}
public interface CD extends C,D {
}
但是,在这种情况下,返回类型实际上是不兼容的 - 返回类型不能同时为void和布尔值。 然而,在上面的例子中, AB
的another()
返回类型既是A
又是B
,因此可以实现两个扩展接口。
此外,看过JLS(8.4.8,8.4.8.3,8.4.8.4)后,我不太明白为什么我的上面的例子非法。 任何人都可以向我解释这个吗?
其次,除了重复AB
中A
或B
的合同要求外,还有其他解决方案/解决方法吗?
对于1.5之前版本的Java,会出现此错误消息(至少我可以在Eclipse中将合规性级别设置为1.4时重现该错误)。 换句话说,确保你正在看旧的规格。
在Java> = 1.5时,以下编译正常。
interface A {
public A another();
}
interface B {
public B another();
}
interface AB extends A,B {
public AB another();
}
如你所说,由于AB
既是A
又是B
,它满足两个接口。
这是Java语言规范(第二版,即Java 1.4)的引用:
9.2接口成员
接口的成员是:
- 那些成员在界面中声明。
- 这些成员继承自直接超级接口 。
- 如果接口没有直接的超级接口,[...]
因此,如果接口声明具有相同签名和不同返回类型或不兼容throws子句的方法 ,则它是编译时错误。
此外, 目前的规范说明如下:
9.4.2超载
如果接口的两个方法(无论是在同一个接口中声明,还是由接口继承,或者声明的和继承的)都具有相同的名称但不同的签名不等于覆盖(第8.4.2节),那么方法名称被称为重载。 这个事实没有任何困难,从来没有导致编译时错误。 返回类型之间或两个方法的throws子句之间没有必需的关系,这两个方法具有相同的名称但不同的签名不是覆盖等效的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.