【发布时间】:2021-12-30 00:43:57
【问题描述】:
我有两个这样定义的模块:
interface Module {
val parameter: JSONObject
}
abstract class FirstModule: Module {
abstract val message: Message
}
....
// many more Modules
我为Module 创建了一个基本侦听器接口,为FirstModule 创建了另一个:
fun interface ModuleListener {
fun ready(module: Module)
}
fun interface FirstModuleListener: ModuleListener {
fun ready(module : FirstModule)
override fun ready(module: Module) {
ready(module as FirstModule)
}
}
假设有一个名为 firstModule() 的函数,如下所示:
fun firstModule(listener: FirstModuleListener)
在KOTLIN 中,当我调用firstModule() 时,事情按预期工作(让用户只用FirstModule 作为参数覆盖ready():
firstModule ( object: FirstModuleListener {
override fun ready(module: FirstModule) {
Log.v(TAG, "module: $module)
}
}
}
但在JAVA 中表现不同。即使其中一个已经被覆盖并且在子界面中有一些内容,它也期望用户覆盖这两个接口方法。
firstModule(new FirstModuleListener() {
@Override public void ready(Module module) { }
@Override public void ready(FirstModule module) {}
}
如何跳过 Java 中的第一个被覆盖的方法调用。是不是因为 Kotlin 中的方法定义支持而不是 Java 中的?
【问题讨论】:
-
不是一个答案,但值得注意的是,在公共方法中这种不安全的演员
ready(module as FirstModule)似乎是一场等待发生的灾难,如果用户知道这是一个 FirstModule 他们已经可以使用其他方法,所以这个方法除了保证崩溃之外没有其他用途。当然,由于缺乏上下文,或者这只是说明问题的示例,这可能看起来很奇怪。 -
方法
firstModule仅接受 FirstModuleListener 最终要求用户(在 kotlin 中)仅覆盖ready(module: FirstModule)。所以我认为这没问题。但感谢您指出。
标签: kotlin kotlin-interop