首页 > 解决方案 > 将 Kotlin 接口翻译成 Java

问题描述

我正在使用这个库,它是一个 CalendarView。https://github.com/kizitonwose/CalendarView

在示例代码中有以下代码将滚动侦听器附加到 CalendarView

 calendarView.monthScrollListener = { // etc}

我不确定如何将其转换为 Java,我尝试以下操作,但找不到“MonthScrollListener”类,它就像它想要其他类型但我找不到该类型。到目前为止,将 Kotlin 转换为 Java 时,其他一切都有效,但我看不出这是如何工作的

mBinding.calendarView.setMonthScrollListener(new MonthScrollListener(){ // etc});

我应该将什么传递给 setMonthScrollListener() 方法?

编辑:当我在 setMonthScrollListener() 上“ctrl 单击”时,它会将我带入 CalendarView 类,并且有以下行:

  public final var monthScrollListener: com.kizitonwose.calendarview.ui.MonthScrollListener? /* = ((com.kizitonwose.calendarview.model.CalendarMonth) -> kotlin.Unit)? */ /* compiled code */

所以我尝试明确引用 MonthScrollListener,但一切都解决到 MonthScrollListener,它不可用......

在此处输入图像描述

标签: javaandroidkotlin

解决方案


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);

推荐阅读