簡體   English   中英

將 Kotlin 接口翻譯成 Java

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM