java - 在java中用通用参数覆盖Kotlin方法 - 方法冲突

标签 java android kotlin interop

我的团队正在为我们的 Android 应用程序迁移到 Kotlin,但我们仍然有很多遗留的 Java 代码,这有时会导致奇怪的代码问题。这是其中一个奇怪的案例。

我有一个 Kotlin 类,将其命名为 MyInterface:

interface MyInterface {
    fun onMyObjectList(myObjectList: List<MyObject>)
}

我需要在用 Java 编写的 Activity 中实现此接口(interface):

class MyActivity implements MyInterface {
...
}

下面是我在 Java 中实现重写方法的方法:

@Override
public void onMyObjectList(@NotNull List<MyObject> objectList) {

}

我确实想要一个 List<MyObject>作为参数,但 IDE 会抛出错误

onMyObjectList(List<MyObject> objectList) in MyActivity clashes with onMyObjectList(List<? extends MyObject> objectList) in MyInterface. Both methods have the same erasure, yet neither overrides the other

我不能使用 List<? extends MyObject>作为参数,因为我将它进一步传递给需要 List<MyObject> 的方法.我如何配置我的 Kotlin 接口(interface),以便它实际使用 List<MyObject>而不是 List<? extends MyObject>什么时候在 Java 中重写?

最佳答案

如果任何方法确实改变了列表或合理地可以,使用 MutableList确实是正确的解决方案。

但否则,如果您最终计划迁移到 Kotlin,并且无法更改其他方法以采用 List<? extends MyObject>此时,我更愿意使用

@Override
public void onMyObjectList(@NotNull List<? extends MyObject> objectList) {

}

并转换到List<MyObject>在传递给遗留方法之前。这是 1) 如果您不改变列表和 2) 一个完整的运行时非操作的安全转换(因此它不会影响性能)。

关于java - 在java中用通用参数覆盖Kotlin方法 - 方法冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49742105/

相关文章:

android - 代理下的gradle同步上的Android Studio 403禁止错误

java - 自带最小化按钮效果

java - Twitter4j 接口(interface)和类结构

没有点的Android单行TextView

java - 按单选按钮两次,计算两次

Kotlin 原生相当于 Retrofit

kotlin - 使用 null 参数调用方法

arraylist - 解释一下为什么显示警告未选中强制转换source.readArrayList(data!!.javaClass.classLoader) as ArrayList<Data>?

java - Android 中的 OnClick 函数未启动任何 Activity

java - 为什么 Spring Metrics 显示初始堆大小大于最大大小?