2017-10-24 5 views
3

私はthisの記事を読んでいました。あなたはKotlinインターフェースでコードを書くことができると言います。 Javaはこのanswerのようにダイヤモンドの問題を回避するためのインタフェースでコードを書くことを許可していませんでした。 Kotlinがインターフェイス内のコードを許可し、複数のインターフェイスをクラス内で実装できる場合、これは "Diamond Problem"をもう一度作成しませんか?「インターフェイスのコード」Kotlin、「死の致命的なダイヤモンド」はどうやって回避されますか?

+1

'Javaはインタフェースでコードを書くことを許可していませんでした。https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html –

+0

ええ、私はそうしませんでした。 Java 8)を使用します。私がリンクしている記事をお読みください – AwaisMajeed

+0

何が起こるか見てみるための例を作成しようとしましたか? – marstran

答えて

2

シナリオ1

2つのインタフェースは、同じシグネチャを持つメソッドを持っており、両方が、それは同じシグネチャを持つメソッド単一のメソッドを実装する必要があるインタフェースで実装していません。

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つの

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

この場合にエラーとなり両方のメソッドが同じrを持たなければならないのでeturn型

ダイアモンドの問題は、KotlinとJavaでは許可されていないクラスの多重継承に関連していますが、2つのインターフェイスを持つインターフェイスを実装してダイアモンドシェイプを作成できます。それ以外の場合はコンパイル時エラーであり、これはダイヤモンド形状の問題を回避します。

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

オーバーライドは、そうでない場合、コンパイラはエラーを表示し、さらに進行しないことが必要です。

関連する問題