我的团队正在为我们的 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 withonMyObjectList(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/