我有一个问题困扰着我几天,但没有解决方案(更直接地说,我认为没有正确的解决方案)。问题涉及回调,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中保留interface MapControlUpdate
定义。
而不是两个回调,您只需保留一个回调并进行适当的转换: