java - 将 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,它不可用......
解决方案
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);
推荐阅读
- linux-kernel - 在 Linux 内核模块中配置 DMA
- java - 添加 admob 横幅广告时出现 RecyclerView ClassCastException
- android - 根据当前 Fragment 处理 Fragment Backstack
- ios - 不同目标的签名证书
- c - 将文本文件加载到二维数组中,然后与文字比较
- python - 在 Python 中使用搜索树的中值字符串
- node.js - Winston 3.x 缺少对 logstash 的支持?
- android-studio - 非法字符:U+0000 这个错误被固定在类的右括号末尾
- three.js - 操纵gltf模型子
- node.js - 使用请求 js 损坏的文件