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
'IT story' 카테고리의 다른 글
이벤트 처리기에 람다 식 사용 (0) | 2020.08.17 |
---|---|
CA2202,이 사건을 해결하는 방법 (0) | 2020.08.17 |
PostgreSQL의 하위 쿼리에서 업데이트 또는 삽입 (여러 행 및 열) (0) | 2020.08.17 |
EF 4.3에서 복합 키를 사용하여 AddOrUpdate로 데이터를 시드하는 방법 (0) | 2020.08.17 |
필드 [name]에 선언 된 [string] 유형에 대한 핸들러가 없습니다. (0) | 2020.08.17 |