在方法冲突中用泛型参数覆盖 Kotlin 方法



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

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

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

我需要在用 Java 编写的活动中实现此接口:

class MyActivity implements MyInterface {
...
}

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

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

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

"我的活动"中的onMyObjectList(List<MyObject> objectList)与"我的界面"中的onMyObjectList(List<? extends MyObject> objectList)冲突。两种方法具有相同的擦除,但都不会覆盖另一种

我不能将List<? extends MyObject>用作参数,因为我要将其进一步传递给需要List<MyObject>的方法。如何配置我的 Kotlin 接口,使其在 Java 中被覆盖时实际使用 List<MyObject> 而不是List<? extends MyObject>

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

但除此之外,如果您打算最终迁移到 Kotlin,并且目前无法更改其他方法进行List<? extends MyObject>,我更喜欢使用

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

并在传递给旧方法之前强制转换为List<MyObject>。这是 1( 如果不改变列表,则为安全强制转换,2( 运行时完全非操作(因此不会影响性能(。

相关内容

  • 没有找到相关文章

最新更新