2017-10-24 14 views
3

나는 this 문서를 읽었으며 Kotlin 인터페이스에 코드를 작성할 수 있다고 말합니다. Java는이 answer에서 다이아몬드 문제를 피하기 위해 인터페이스에 코드를 작성하는 것을 허용하지 않았습니다. Kotlin이 인터페이스에서 코드를 허용하고 클래스에서 여러 인터페이스를 구현할 수 있다면 "다이아몬드 문제"가 다시 발생하지 않습니까?"인터페이스의 코드"Kotlin, "죽음의 치명적인 다이아몬드"를 어떻게 피합니까?

+1

'Java에서 인터페이스에 코드 작성을 허용하지 않았습니다. https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html –

+0

예, 그렇지 않았습니다. 자바 8). 내가 링크 된 기사를 읽어주세요 – AwaisMajeed

+0

무슨 일이 일어나는지보기 위해 예제를 만들려고 했습니까? – marstran

답변

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

예 이때

에 오류가있을 것이다 가지고 두 컴파일러 모두 동일한 r을 가져야하기 때문에 대소 문자가 혼합 된 컴파일러 오류가 발생합니다. eturn 유형

다이아몬드 문제는 두 인터페이스가있는 인터페이스를 구현하여 다이아몬드 모양의 시나리오를 만들 수 있지만 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 
    } 
} 

재정 그렇지 않으면 컴파일러 오류가 표시되고 더 이상 진행되지 않습니다 필요하다.