我正在阅读this文章,它说你可以在Kotlin界面中编写代码。 Java不允许在接口中编写代码以避免钻石问题answer。如果Kotlin允许接口中的代码和多个接口可以在类中实现,那么这不会再次创建“钻石问题”吗?
答案 0 :(得分:2)
情景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
}
}
覆盖是必要的,否则编译器将显示错误并且不会继续进行。