在Kotlin ,我有MutableList<Something> noNulls = ...MutableList<Something?> nullsInBetween = ...

我如何用Kotlin编写一个方法,它可以同时接受这两种类型,同时保持相同的引用?

fun removeFirstElementFromList(theList:MutableList<Something?>){
  theList.remove(0)
}

这对列表noNulls不起作用.

(在Java中,它只需removeFirstElementFromList(List<Something> theList),这两种情况都适用)


继续这个问题,我可以在保持对Kotlin中原始列表的相同引用的同时,将List<Something?> original转换为MutableList<Something?>吗?(假设原始实例是可变的,但分配给List&lt;&gt;)

推荐答案

如果你不关心列表的类型,你可以使用*投影:

fun removeFirstElementFromList(theList:MutableList<*>){
  theList.removeAt(0)
}

如果需要添加到列表中,可以将其设置为逆变量:

fun addElementToList(theList:MutableList<in Something>){
  theList.add(Something())
}

如果需要从列表中检索,可以将其设置为协变:

fun callFooOnFirstItemOfList(theList:MutableList<out Something?>){
  theList.firstOrNull()?.foo()
}

如果需要从列表中拉出一项并将其放回原处,则可以对函数使用泛型类型.

fun <T: Something?> duplicateFirstItemOfList(theList:MutableList<T>){
  theList.firstOrNull()?.let { theList.add(it) }
}

但我想不出一种方法来创建一个函数,它可以安全地让您从列表中检索项目,并向列表中添加一些您没有从列表中检索的内容.

Android相关问答推荐

如何正确增加LazyStream中的变量

如何使用Gradle风味在两个Kotlin导入(Google vs Amazon Java billing library)之间进行 Select ?

如何将子零部件的大小调整为可以调整大小的父组件大小?

BroadCastReceiver的onReceive方法中的Intent上的Extras为空

我正在创建一个简单的连接四个游戏,我需要一个弹出式窗口当你赢了

安卓喷气背包组成倒计时动画

我无法连接到信号机

如何在jetpack compose中使可组合的屏幕zoom 到不同的手机(屏幕)尺寸?

如何在这段代码android jetpack compose中实现全屏滚动

Android:使用依赖项 ViewModelProviderFactory 初始化 ViewModel 的正确方法

在 jetpack compose 中交替使用 View.INVISIBLE

如何在组件之间导航

Jetpack Compose - 每次点击按钮都不起作用

错误:构建 react-native 应用程序时包 com.facebook.react.bridge 不存在

为什么我在 Jetpack Compose 中被警告可选修饰符参数应该具有默认值修饰符?

如何在jetpack compose中创建自定义rememberState?

可扩展性 Qt 5.15 Android

MVVM - 这个逻辑的最佳层是什么?

等到上一个事件完成 Rx

即使我在单选按钮上明确设置了选中状态,RecyclerView 中的单选按钮也会随机取消选中