我正在尝试来自https://github.com/dkandalov/kotlin-99#lists 的一些示例代码。首先有一个函数,它接受任何类型的列表并返回一个列表列表
fun <T> pack(list: List<T>):List<List<T>> =
if (list.isEmpty()) emptyList()
else{
val packed = list.takeWhile { it==list.first() }
listOf(packed) + pack(list.drop(packed.size))
}
它需要一个类似 [1,1,1,3,4,5,5,5] 的列表并返回 [[1,1,1],[3],[4],[5,5,5]],即,它对整数的运行进行分组。
现在我写了一个函数,它接受一个运行长度对其进行编码。我的函数会返回上面的例子[Pair(1,3),3,4,Pair(5,3)]
。我写了以下函数
fun <T> runLength2(list: List<T>): List<Any> =
pack(list).map { it -> if(it.size>1) it[0] to it.size else it[0]}
但它会导致类型推断错误
类型推断失败。必需的 List < Any > ,找到 List< Any?>
对于返回类型。
如果我这样插入:Any
,问题就解决了。
fun <T:Any> runLength2(list: List<T>): List<Any> =
pack(list).map { it -> if(it.size>1) it[0] to it.size else it[0]}
我是 Kotlin 的新手。有人可以解释为什么添加 Any 可以解决问题以及首先是什么导致了问题?
这是关于可空性的。
在 Kotlin 中,顶级类型是Any?
,它可以容纳任何对象或null
。Any
但是,subtype不可为空,并且不能存储空值。
在您的第一个版本中,泛型类型T
可以是任何类型;特别是,它可能是一个可为空的类型。所以编译器不会让你返回T
as Any
,以防它为空。
您可以通过将其声明为 returnAny?
或将泛型类型限制为不可为空来解决此问题。在您的第二个版本中,您通过限制T
为不可为空Any
类型来完成后者。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句