具有相同方法名称和签名的两个接口。但是由单个类实现,那么编译器将如何识别哪个方法用于哪个接口?
前任:
interface A{
int f();
}
interface B{
int f();
}
class Test implements A, B{
public static void main(String... args) throws Exception{
}
@Override
public int f() { // from which interface A or B
return 0;
}
}
原文由 Jothi 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果一个类型实现了两个接口,并且每个
interface
定义了一个具有相同签名的方法,那么实际上只有一个方法,并且它们是不可区分的。如果,比如说,这两个方法有冲突的返回类型,那么这将是一个编译错误。这是继承、方法覆盖、隐藏和声明的一般规则,不仅适用于 2 个继承的interface
方法之间的可能冲突,还适用于interface
和超级class
方法,甚至只是由于泛型的类型擦除而发生冲突。兼容性示例
这是一个示例,您有一个
interface Gift
,它有一个present()
方法(如赠送礼物),还有一个interface Guest
也有 - apresent()
a----
方法(如客人在场且未缺席)。Presentable johnny
既是Gift
又是Guest
。上面的代码片段编译并运行。
请注意, 只有一个
@Override
是必需的!!! .这是因为Gift.present()
和Guest.present()
是“@Override
等价物”( JLS 8.4.2 )。Thus,
johnny
only has one implementation ofpresent()
, and it doesn’t matter how you treatjohnny
, whether as aGift
or作为Guest
,只有一种方法可以调用。不兼容示例
这是一个示例,其中两个继承的方法不是
@Override
等价的:这进一步重申,从
interface
继承成员必须遵守成员声明的一般规则。 Here we haveGift
andGuest
definepresent()
with incompatible return types: onevoid
the otherboolean
.出于同样的原因,您不能在一种类型中使用void present()
和boolean present()
,此示例会导致编译错误。概括
您可以继承
@Override
等价的方法,但要满足方法覆盖和隐藏的通常要求。因为它们是@Override
等价 的,实际上只有一种方法可以实现,因此没有什么可以区分/选择的。编译器不必识别哪个方法适用于哪个接口,因为一旦它们被确定为
@Override
等价,它们就是相同的方法。解决潜在的不兼容性可能是一项棘手的任务,但这完全是另一个问题。
参考