gpt4 book ai didi

Java/Kotlin 回调语法 - 转换为 Kotlin 后我真的需要 2 个回调定义吗?

转载 作者:行者123 更新时间:2023-12-01 19:31:43 26 4
gpt4 key购买 nike

我有一个问题困扰了我几天,但没有解决(更直接地说,没有我认为正确的解决方案)。问题在于回调、Java 实现与 Kotlin 实现

我有这个Java方法:

public void setOnSelectionChange(MapControlUpdate mapMenuControl) {
this.mapControlUpdate = mapMenuControl;
}

private MapControlUpdate mapControlUpdate;

public interface MapControlUpdate {
void onSelectionChange(MAP_TYPE mapType);
}

使用上面的实现,我在 Java 和 Kotlin 中都得到了我想要的(如下)。

Java(之前):

widgetMapType.setOnSelectionChange(mapType -> {
Toast.makeText(getContext(), "clicked: " + mapType, Toast.LENGTH_LONG).show();
});

Kotlin(之前):

widgetMapType.setOnSelectionChange {
Toast.makeText(context, "clicked: $it", Toast.LENGTH_LONG).show()
}

转换后的新 Kotlin 代码为:

fun setOnSelectionChange(mapMenuControl: MapControlUpdate?) {
mapControlUpdate = mapMenuControl
}

private var mapControlUpdate: MapControlUpdate? = null

转换为 Kotlin 后,Java 用法保持不变,但我需要按如下方式更改 Kotlin 代码,否则会出现语法错误:

Kotlin(之后):

widgetMapType.setMapMenuControl(object: WidgetMapType.MapControlUpdate {
override fun onSelectionChange(mapType: WidgetMapType.MAP_TYPE?) {
Toast.makeText(context, "clicked: $mapType", Toast.LENGTH_LONG).show()
}
})

为了回到我想要的位置,我发现唯一的解决方案似乎是实现 2 个回调;一个允许 Java 使用原始语法,另一个允许 Kotlin 语法保持不变。

这是我正在使用的代码(它有效):

var onSelectionChange: MapControlUpdate? = null

private var onSelectionChangeListener: ((MapDisplayTypes?) -> Unit)? = null

fun setOnSelectionChange(listener: (MapDisplayTypes?) -> Unit){
onSelectionChangeListener = listener
}

我会根据需要触发两个回调

onSelectionChange?.onSelectionChange(it)    // Java
onSelectionChangeListener?.invoke(it) // Kotlin

我真的不敢相信没有更正确的方法,但我的搜索(此处和网络上)返回了大量 Kotlin 和 Java 的示例,但它们都与我上面基于代码的示例一致(也显示了多于)。我怀疑可能有注释或我遗漏的东西,因此找不到其他解决方案,我转向这里的社区。

提前谢谢您!!

最佳答案

我怀疑您只需要保留 Java 中的接口(interface) MapControlUpdate 定义。

关于Java/Kotlin 回调语法 - 转换为 Kotlin 后我真的需要 2 个回调定义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59525086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com