【问题标题】:Overriding Kotlin method with generic parameter in java - method clash在 java 中使用泛型参数覆盖 Kotlin 方法 - 方法冲突
【发布时间】:2018-04-09 21:41:58
【问题描述】:

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

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

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

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

class MyActivity implements MyInterface {
...
}

以下是我在 Java 中实现被覆盖方法的方法:

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

}

我确实想得到一个List&lt;MyObject&gt; 作为参数,但是 IDE 抛出了一个错误

MyActivity 中的onMyObjectList(List&lt;MyObject&gt; objectList) 与 MyInterface 中的onMyObjectList(List&lt;? extends MyObject&gt; objectList) 发生冲突。两种方法都有相同的擦除,但都没有覆盖另一个

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

【问题讨论】:

  • 我偶然尝试重现此错误消息,但不能。您能否添加工具/等版本的详细信息?你用的是什么?
  • Android Studio 3.1,Kotlin 插件版本:1.2.31-release-Studio3.1-1。 Android目标SDK:27,编译SDK:27,构建工具版本:27.0.3
  • 我目前不在电脑前,但如果我没记错的话,Kotlin 的List 被声明为List&lt;out E&gt;,看看你怎么不能使用? extends MyObject,你不能定义使用 Kotlin 的 MutableList 或 Java 的 List 的接口?或者这不是一个选择?一年多没用 Kotlin 了,不了解的还请见谅。
  • 我同意MutableList,我认为这是不变的?
  • @VinceEmigh 这确实有效,尽管我对在 Kotlin 中使用 java 集合有点警惕。 MutableList 成功了!

标签: java android kotlin interop


【解决方案1】:

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

但除此之外,如果您打算最终计划迁移到 Kotlin 并且此时无法更改其他方法以采用 List&lt;? extends MyObject&gt;,我更愿意使用

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

}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多