IT story

Kotlin : 인터페이스…에는 생성자가 없습니다.

hot-time 2020. 8. 17. 10:27
반응형

Kotlin : 인터페이스…에는 생성자가 없습니다.


일부 Java 코드를 Kotlin으로 변환 중이며 Kotlin 코드에 정의 된 인터페이스를 인스턴스화하는 방법을 잘 이해하지 못합니다. 예를 들어, 인터페이스 (Java 코드로 정의 됨)가 있습니다.

public interface MyInterface {
    void onLocationMeasured(Location location);
}

그런 다음 Kotlin 코드에서이 인터페이스를 인스턴스화합니다.

val myObj = new MyInterface { Log.d("...", "...") }

잘 작동합니다. 그러나 MyInterface를 Kotlin으로 변환하면 :

interface MyInterface {
    fun onLocationMeasured(location: Location)
}

오류 메시지가 나타납니다. Interface MyListener does not have constructors인스턴스화하려고 할 때-구문 외에는 아무것도 변경되지 않은 것 같습니다. Kotlin에서 인터페이스가 작동하는 방식을 오해합니까?


Java 코드는 단일 추상 메소드를 사용하여 람다를 인터페이스로 자동 변환하는 SAM 변환에 의존합니다. 현재 Kotlin에 정의 된 인터페이스 에는 SAM 변환이 지원되지 않습니다 . 대신 인터페이스를 구현하는 익명 객체를 정의해야합니다.

val obj = object : MyInterface {
    override fun onLocationMeasured(location: Location) { ... }
}

가장 좋은 해결책은 Java 인터페이스 대신 typealias를 사용하는 것입니다.

typealias MyInterface = (Location) -> Unit

fun addLocationHandler(myInterface:MyInterface) {

}

다음과 같이 등록하십시오.

val myObject = { location -> ...}
addLocationHandler(myObject)

또는 심지어 클리너

addLocationHandler { location -> ...}

다음과 같이 호출하십시오.

myInterface.invoke(location)

현재 3 가지 옵션은 다음과 같습니다.

  • typealias (자바에서 호출 할 때 지저분 함)
  • kotlin 인터페이스 (kotlin에서 호출 할 때 지저분 함; 객체를 생성해야 함) 이것은 IMO에서 큰 발걸음을 내디뎠습니다.
  • 자바 인터페이스 (kotlin에서 호출 할 때 덜 지저분 함; 람다는 인터페이스 이름이 추가되어 객체가 필요하지 않습니다. 함수 괄호 규칙 외부에서 람다를 사용할 수 없습니다)

라이브러리를 Kotlin으로 변환 할 때 실제로 모든 인터페이스를 Java 코드에 남겨 두었습니다. Kotlin에서 Kotlin을 호출하는 것보다 Kotlin에서 Java를 호출하는 것이 더 깔끔했기 때문입니다.


다음 과 같은 Java 클래스 가있는 경우 :

recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new RecyclerTouchListener.ClickListener()
        {
              //Your Code
        }));

이 코드를 Java에서 Kotlin으로 다음 과 같이 변환 하십시오.

override fun showJozList (list : List<ResponseGetJuzList.Parameter4>) {
        adapter.addData(list)
        jozlist_recycler.addOnItemTouchListener(RecyclerTouchListener(
                activity ,
                jozlist_recycler ,
                object : RecyclerTouchListener.ClickListener
                    {
                          //Your Code
                    }))

Java 인터페이스 변환 :

new RecyclerTouchListener.ClickListener()

코 틀린 인터페이스 스타일 :

object : RecyclerTouchListener.ClickListener

다음과 같이 인터페이스에 액세스하십시오.

 object : MyInterface {
    override fun onSomething() { ... }
}

참고 URL : https://stackoverflow.com/questions/43737785/kotlin-interface-does-not-have-constructors

반응형