내가 만든 인터페이스:
interface ProgressListener {
fun transferred(bytesUploaded: Long)
}
하지만 그것을 사용할 수 있습만으로 익명이 아닌 클래스 람다
dataManager.createAndSubmitSendIt(title, message,
object : ProgressListener {
override fun transferred(bytesUploaded: Long) {
System.out.println(bytesUploaded.toString())
}
})
나는 그것을 생각해야 될 가능성이 그것을 대체하여 람다:
dataManager.createAndSubmitSendIt(title, message, {System.out.println(it.toString())})
그러나 나는 오류:유형이 불일치하는 데 필요-ProgressListener,발견-()->단위는 무엇입니까?
무엇이 잘못된 것입니까?
로@zsmb13 말했다,샘 변환을 위해서만 지원됩 Java 인터페이스가 있습니다.
을 만들 수있는 확장 기능이 작동하도록 하지만:
// Assuming the type of dataManager is DataManager.
fun DataManager.createAndSubmitSendIt(title: String,
message: String,
progressListener: (Long) -> Unit) {
createAndSubmitSendIt(title, message,
object : ProgressListener {
override fun transferred(bytesUploaded: Long) {
progressListener(bytesUploaded)
}
})
}
코 틀린에만 지원하는 샘 변환 Java 인터페이스가 있습니다.
...이 기능을 작동을 위한 Java interop;이후 코 틀린 는 적절한 기능의 유형,자동 변환 기능을 구현의 틀린 인터페이스는 불필요하므로 지원되지 않습니다.
--공식 문서
를 사용하려면 람다에서 매개 변수들의 기능을 가능 매개 변수는 대신 인터페이스입니다. (지금은 적어도 있습니다. 지원하는 샘 변환을 위한 틀린 인터페이스는 지속적인 토론,그것은 하나의 가능한 미래의 특징에서 코 틀린 1.1 라이브 스트리밍.)
조금 늦게자:만드는 대신 인터페이스,당신이 컴파일을 만들 중 하나를 복용하여 기능을 대신 직접 인터페이스에서 당신의 datamanager 은 다음과 같습니다.
fun createAndSubmitSendIt(title: String, message: String, transferred: (Long) -> Unit) {
val answer = TODO("whatever you need to do")
transferred(answer)
}
그리고 당신은 그것을 사용하는 방법을 좋아 할 것입니다. 제가 제대로 기억하는 것이라면,무엇을 틀린/jvm 을 컴파일러가지입니다 동일기 인터페이스입니다.
Hope it helps!
다른 솔루션을 것을 선언하여 typealias,주입이 어딘가에이고 호출한다. 여기를 들어:
internal typealias WhateverListener = (String) -> Unit
그리고 우리는 주사는 typealias 를 우리의 클래스:
class Gallery constructor(private val whateverListener: WhateverListener) {
...
galleryItemClickListener.invoke("hello")
...
}
그래서 우리는 우리는 람다:
val gallery = Gallery { appNavigator.openVideoPlayer(it) }
크레딧을 제 동료인 조엘 라자,누가 내게 보이는 트릭 동안 해결책을 찾기 위해 노력하고<3.
이 없다 하나의 궁극적인 솔루션을 위한 경우 이 문제는 것을 목표로 최고의 액세스 환경에서 모두 코 틀린과 Java.
는 경우에 개발자의 코 틀린 생각하지 않았 샘 변환을 위한 틀린 인터페이스는 불필요,"코 틀린 인터페이스"방법이 될 것이 최고의 솔루션입니다.
https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions 또한 이 기능을 작동을 위한 Java interop;이후 코 틀린 는 적절한 기능의 유형,자동 변환 기능을 구현의 틀린 인터페이스는 불필요하므로 지원되지 않습니다.
선택 최고의 솔루션 사용에 대한 경우입니다.
코 틀린 API:완벽한 코 틀린스:완벽한 자바스: 자동 생성되는 매개변수 유형은 다음과 같 Function1(큰 문제가되지 않 Java8lambda) *자세한 정보 이익 단위입니다.인스턴스`를 무효로 돌아갑니다.
클래스 KotlinApi{ 재미있는 데모(listener:(응답:String)->단위){ 리스너("응답") } }
재미 kotlinConsumer(){ KotlinApi().데모{성공을-> system.out.println(공) } }
public void javaConsumer(){ 새로운 KotlinApi().모(s->{ 시스템입니다.니다.system.out.println(s); 익 단위입니다.인스턴스 }); }
코 틀린 API:추가적인 인터페이스를 정의합니다. 코 틀린스:도 자세한 정보 *자바스:완벽한
클래스 KotlinApi{ 인터페이스 수신기{ 재미 onResponse(응답:String) }
재미있는 데모(listener:Listener){ 청취자 수 있습니다.onResponse("응답") } }
재미 kotlinConsumer(){ KotlinApi().모(object:KotlinApi.청취자{ 재정의 재미 onResponse(응답:String){ system.out.println(응답) } }) }
//경우 코 틀린 지원했 샘 변환을 위한 틀린 인터페이스가 있습니다. :( //재미있는 kotlinConsumer(){ //KotlinApi().데모{ //println(it) //} //}
public void javaConsumer(){ 새로운 KotlinApi().모(s->{ 시스템입니다.니다.system.out.println(s); }); }
코 틀린 API:혼합 Java 코드입니다. 코 틀린 액세스 조금 자세한 정보 *자바스:완벽한
클래스 KotlinApi{ 재미있는 데모(listener:Listener){ 청취자 수 있습니다.onResponse("응답") } }
공용 인터페이스 수신기{ void onResponse(String 응답); }
//반 샘 전환 재미 kotlinConsumer(){ KotlinApi().모(청취자{ system.out.println(it) }) }
public void javaConsumer(){ 새로운 KotlinApi().모(s->{ 시스템입니다.니다.system.out.println(s); }); }
코 틀린 API:여러 방법 구현 코 틀린스:완벽한 경우 올바른 방법이 사용됩니다. 자동차 완료를 제안한 자세한 방법. *자바스:완벽합니다. 자동 완성하지 않는 기능 입력 방법이기 때문에
JvmSynthetic
석
클래스 KotlinApi{ 인터페이스 수신기{ 재미 onResponse(응답:String) }
재미있는 데모(listener:Listener){ 데모{ 청취자 수 있습니다.onResponse(it) } }
@JvmSynthetic//방지 JVM 이 방법을 사용하려면 재미있는 데모(listener:(String)->단위){ 리스너("응답") } }
재미 kotlinConsumer(){ KotlinApi().데모{ system.out.println(it) } }
public void javaConsumer(){ 새로운 KotlinApi().모(s->{ 시스템입니다.니다.system.out.println(s); }); }
코 틀린 API 없 코 틀린 API,모든 API 코드는 Java 코 틀린스:완벽한 *자바스:완벽한
공급 JavaApi{ 공개 데모(청취자 수신기){ 청취자 수 있습니다.onResponse("응답"); }
공용 인터페이스 수신기{ void onResponse(String 응답); }
}
//전체 샘 전환 재미 kotlinConsumer(){ JavaApi().데모{ system.out.println(it) } }
public void javaConsumer(){ 새로운 JavaApi().모(s->{ 시스템입니다.니다.system.out.println(s); }); }