将 Kotlin 接口翻译为 Java

4
我正在使用这个日历视图库。https://github.com/kizitonwose/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,它不可用...

enter image description here


我尝试了这个,但是它显示“无法解析符号MonthScrollListener”。 - brux
4
这是因为MonthScrollListener并不是一个实际的类型,它是一个别名,在这里可以找到:https://github.com/kizitonwose/CalendarView/blob/e2efbe7da6b890acb97933b982f6d4c8a512ba05/library/src/main/java/com/kizitonwose/calendarview/ui/Types.kt#L19。 - Dioxin
是的,我在搜索时遇到了这个问题,我应该如何在Java中使用它?这可能吗? - brux
1
@brux 显然不行. - Dioxin
啊,真遗憾 :( - brux
1个回答

1

typealias在Java中不可见,但是你提到的例子是:

typealias MonthScrollListener = (CalendarMonth) -> Unit

在Java世界中,它应该类似于单方法接口,如下所示(下面会详细介绍):
import kotlin.Unit;
interface MonthScrollListener {
  Unit whatever(CalendarMonth cm);
}

这可能是void,因为在Kotlin中,Unit就是这个意思,但你知道的——生活。

因此,在期望监听器的方法中传递Lambda应该如下所示:

whatever.setMonthScrollListener((CalendarMonth cm) -> {
  // w00t
  return kotlin.Unit.INSTANCE;
});

我基本上写了与@MishaAkopov建议的相同方法。
编辑(阅读后):
但它实际上是什么类型? Kotlin标准库似乎有一堆接口,例如Function0 和Function2 ,它们都有一个方法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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接