“接口中的代码”Kotlin,他们如何避免“致命的钻石死亡”?

我正在阅读这篇文章,它说你可以在Kotlin接口中编写代码。 Java不允许在接口中编写代码来避免钻石问题。 如果Kotlin允许在接口中使用代码,并且可以在一个类中实现多个接口,那么不会再一次创建“钻石问题”了吗?

情况1

两个接口具有相同的签名方法,两个接口都没有在接口中实现,那么就需要实现一个具有相同签名的方法单一方法。

 interface InterfaceA { fun sum(a: Int, b: Int) } interface InterfaceB { fun sum(x: Int, y: Int) } class TestClass : InterfaceA, InterfaceB { override fun sum(x: Int, y: Int) { return a+b } } 

情景2

两个接口具有相同签名的方法,不同的返回类型在这种情况下是错误的

 interface InterfaceA { fun sum(a: Int, b: Int):Int = a+b } interface InterfaceB { fun sum(x: Int, y: Int) } class TestClass : InterfaceA, InterfaceB { override fun sum(x: Int, y: Int) { return a+b } } 

在这种情况下编译器显示错误,因为两个方法必须具有相同的返回类型

钻石问题与Kotlin和Java中不允许的类的多重继承相关联,尽管您可以通过实现带有两个接口的接口来创建菱形的场景,然后在kotlin中您需要覆盖所有的方法,否则它是一个编译时间错误,这避免了钻石形状的问题。

 interface InterfaceA { fun sum(a: Int, b: Int): Int { print("InterFaceA"); return a + b } } interface InterfaceB:InterfaceA { override fun sum(a: Int, b: Int): Int { print("InterFaceB"); return a + b } } interface InterfaceC:InterfaceA { override fun sum(a: Int, b: Int): Int { print("InterFaceC"); return a + b } } interface InterfaceD : InterfaceB, InterfaceC { override fun sum(a: Int, b: Int): Int { print("InterFaceD"); return a + b } } 

否则编译器会显示错误,不会继续进行。