Kotlin兼容可空/非空MutableList方法及List转MutableList保持引用问题
问题解答
1. 编写兼容两种列表类型的方法
Kotlin的MutableList属于不变型(invariant)泛型,这意味着MutableList<Something>无法直接赋值给MutableList<Something?>,和Java的协变泛型行为存在差异。要让方法同时接收这两种类型且操作原列表引用,可通过泛型上界约束实现:
fun <T : Something?> removeFirstElementFromList(theList: MutableList<T>) { theList.removeAt(0) // 注意:remove(0)是移除值为0的元素,移除第一个元素应使用removeAt(0) }
这个泛型函数中,T的上界设为Something?,既可以接收Something(Something是Something?的子类型),也能接收Something?,且全程操作原列表引用,不会创建新列表。
你也可以用星号投影MutableList<*>简化写法,但泛型约束的方式更具类型安全性:
fun removeFirstElementFromList(theList: MutableList<*>) { theList.removeAt(0) }
2. 将List强转为MutableList并保持原引用
如果原实例本身就是MutableList,只是被赋值给了List类型的变量,那么可以安全强转为MutableList<Something?>,且保持原引用一致。但必须确保原实例确实是可变列表,否则会抛出ClassCastException。
示例代码:
// 原实例是MutableList,仅被赋值为List类型 val original: List<Something?> = mutableListOf(Something(), null) // 强转为MutableList val mutableList = original as MutableList<Something?> // 操作mutableList会直接修改原列表 mutableList.removeAt(0)
为避免类型转换异常,建议先做类型检查:
if (original is MutableList<*>) { val mutableList = original as MutableList<Something?> mutableList.removeAt(0) }
内容的提问来源于stack exchange,提问作者Yajnesh T
相关产品推荐
相关产品推荐

