[英]Translate Kotlin interface to Java
我正在使用這個庫,它是一個 CalendarView。 https://github.com/kizitonwose/CalendarView
在示例代碼中有以下代碼將滾動偵聽器附加到 CalendarView
calendarView.monthScrollListener = { // etc}
我不確定如何將其轉換為 Java,我嘗試了以下操作,但是找不到“MonthScrollListener”類,就像它想要其他類型一樣,但我找不到該類型。 到目前為止,在將 Kotlin 翻譯成 Java 時,其他一切都有效,但我看不出這是如何工作的
mBinding.calendarView.setMonthScrollListener(new MonthScrollListener(){ // etc});
我應該向 setMonthScrollListener() 方法傳遞什么?
編輯:當我在 setMonthScrollListener() 上“ctrl click”時,它會將我帶入 CalendarView 類,並且有以下行:
public final var monthScrollListener: com.kizitonwose.calendarview.ui.MonthScrollListener? /* = ((com.kizitonwose.calendarview.model.CalendarMonth) -> kotlin.Unit)? */ /* compiled code */
所以我嘗試顯式引用 MonthScrollListener 但一切都被解析到 MonthScrollListener,它不可用......
typealias
在 Java 中不可見,但鑒於您正在談論的示例是:
typealias MonthScrollListener = (CalendarMonth) -> Unit
然后在 Java 世界中,它應該類似於單一方法接口,例如(下面將詳細介紹):
import kotlin.Unit;
interface MonthScrollListener {
Unit whatever(CalendarMonth cm);
}
它可能是void
因為這就是Unit
在 Kotlin 中的意思,但你知道 - 生命。
因此,在期望偵聽器的方法中傳遞 Lambda 應該如下所示:
whatever.setMonthScrollListener((CalendarMonth cm) -> {
// w00t
return kotlin.Unit.INSTANCE;
});
我基本上已經按照@MishaAkopov 的建議編寫了相同的方法
編輯(閱讀后):
但它實際上是什么類型? 看起來 Kotlin 標准庫有一堆接口,比如Function0<R>
和Function2<P1,P2,R>
,它們有一個方法invoke
。 因此,如果您需要在以前的 Java 版本中使用上面的 Kotlin 代碼,它將看起來像:
Function1<CalendarMonth, Unit> listener = new Function1<CalendarMonth, Unit>() {
@Override
public Unit invoke(CalendarMonth cm) {
// Do something with calendar month
return kotlin.Unit.INSTANCE;
}
}
whatever.setMonthScrollListener(listener);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.