나는 this 문서를 읽었으며 Kotlin 인터페이스에 코드를 작성할 수 있다고 말합니다. Java는이 answer에서 다이아몬드 문제를 피하기 위해 인터페이스에 코드를 작성하는 것을 허용하지 않았습니다. Kotlin이 인터페이스에서 코드를 허용하고 클래스에서 여러 인터페이스를 구현할 수 있다면 "다이아몬드 문제"가 다시 발생하지 않습니까?"인터페이스의 코드"Kotlin, "죽음의 치명적인 다이아몬드"를 어떻게 피합니까?
3
A
답변
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
}
}
재정 그렇지 않으면 컴파일러 오류가 표시되고 더 이상 진행되지 않습니다 필요하다.
'Java에서 인터페이스에 코드 작성을 허용하지 않았습니다. https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html –
예, 그렇지 않았습니다. 자바 8). 내가 링크 된 기사를 읽어주세요 – AwaisMajeed
무슨 일이 일어나는지보기 위해 예제를 만들려고 했습니까? – marstran