"Código en interfaces" Kotlin, ¿cómo evitan el "diamante mortal de la muerte"?

Estaba leyendo este artículo y dice que puedes escribir código en las interfaces de Kotlin. Java no permitió escribir código en la interfaz para evitar el problema de los diamantes a partir de esta respuesta . Si Kotlin permite el código en la interfaz y se pueden implementar múltiples interfaces en una class, ¿no crea esto el "Problema Diamante" una vez más?

escenario 1

Dos interfaces tienen methods con la misma firma y ambas no tienen implementación en la interfaz, entonces necesita implementar un método de método único con la misma firma.

Ejemplo

 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 } } 

Escenario 2

Dos interfaces tienen methods con la misma firma y diferente tipo de devolución será un error en este caso

Ejemplo

 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 } } 

En este caso, el comstackdor muestra un error porque ambos methods deben tener el mismo tipo de devolución

El problema del diamante está asociado con la inheritance múltiple de classs que no está permitida en Kotlin ni en Java, aunque puedes crear un escenario de forma de diamante implementando una interfaz con dos interfaces, entonces en kotlin debes anular todos los methods, de lo contrario es un comstack el error de time y esto evita el problema de la forma del diamante.

Ejemplo

 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 } } 

la anulación es necesaria; de lo contrario, el comstackdor mostrará un error y no continuará.