Java-使用相同的方法和不同的返回类型实现多个接口
考虑以下代码:
public interface A { public A another();
}
public interface B {
public B another();
}
public interface AB extends A,B {
public AB another();
}
这会导致以下错误AB
:
类型B和A不兼容;都定义了another(),但是返回类型不相关
我已经看到了这样的问题,并按照公认的答案中的不兼容示例进行操作-即
public interface C { public void doSomething();
}
public interface D {
public boolean doSomething();
}
public interface CD extends C,D {
}
但是,在那种情况下,返回类型确实是不兼容的-返回类型不能同时为void和布尔值。而在上面的示例中,another()
返回类型AB
是an A
和a
B
,因此可以实现两个扩展接口。
此外,在查看了JLS(8.4.8、8.4.8.3、8.4.8.4)之后,我不太理解为什么我的示例在上面是非法的。谁能向我解释一下?
其次,除了重复A
或B
中的合同要求之外,是否有其他解决方案/变通办法AB
?
回答:
对于Java
1.5之前的版本,会出现此错误消息(至少在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)的引文:
接口的成员是:
- 这些成员在接口中声明。
- 这些 。
- 如果接口没有直接的超级接口,则[…]
因此,如果接口 或不兼容的throws子句,则将导致编译时错误。
此外, 当前 规范还表示以下内容:
如果接口的两种方法(都是在同一个接口中声明的,或者都是由一个接口继承的,或者一个声明且是一个继承的)的名称相同,但签名不同,那么它们不是等效的(第8.4.2节),则方法名称被认为是重载的。这个事实不会造成任何困难,并且它本身也不会导致编译时错误。返回类型之间或名称相同但签名不相同的两个方法的throws子句之间没有必需的关系。
以上是 Java-使用相同的方法和不同的返回类型实现多个接口 的全部内容, 来源链接: utcz.com/qa/421590.html