我的团队正在为我们的 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( 运行时完全非操作(因此不会影响性能(。