用java中的泛型参数覆盖Kotlin方法 - 方法冲突

时间:2018-04-09 21:41:59

标签: java android kotlin interop

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

我有一个Kotlin类,称之为MyInterface:

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

我需要在一个用Java编写的Activity中实现这个接口:

class MyActivity implements MyInterface {
...
}

以下是我如何在Java中实现重写方法:

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

}

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

  MyActivity中的

onMyObjectList(List<MyObject> objectList)与MyInterface中的onMyObjectList(List<? extends MyObject> objectList)冲突。两种方法都有相同的擦除,但都没有覆盖其他方法

我无法使用List<? extends MyObject>作为参数,因为我将其进一步传递给期望List<MyObject>的方法。如何配置我的Kotlin接口,以便在Java中重写时实际使用List<MyObject>而不是List<? extends MyObject>

1 个答案:

答案 0 :(得分:0)

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

但是否则,如果 计划最终迁移到Kotlin并且此时无法更改另一种方法List<? extends MyObject>,我只想使用

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

}

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