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

问题描述 投票:0回答:2

我有一个问题困扰着我几天,但没有解决方案(更直接地说,我认为没有正确的解决方案)。问题涉及回调,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();
});

科特琳(之前):

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代码,否则会出现语法错误:

科特林(之后):

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

为了回到我想去的地方,我发现唯一的解决方案似乎是实现2个回调; 1允许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实现与Kotlin ...

java android kotlin interface callback
2个回答
2
投票

我怀疑您只需要在Java中保留interface MapControlUpdate定义。


0
投票

而不是两个回调,您只需保留一个回调并进行适当的转换:

© www.soinside.com 2019 - 2024. All rights reserved.