Any 在这种情况下是什么意思?为什么添加`:Any` 可以消除编译器错误?

阿伦

我正在尝试来自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?,它可以容纳任何对象或nullAny但是,subtype不可为空,并且不能存储空值。

在您的第一个版本中,泛型类型T可以是任何类型;特别是,它可能是一个可为空的类型。所以编译器不会让你返回Tas Any,以防它为空。

您可以通过将其声明为 returnAny?或将泛型类型限制为不可为空来解决此问题在您的第二个版本中,您通过限制T为不可为空Any类型完成后者

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么std :: function <boost :: any()>在这种情况下不起作用?

Promise<OverlayEventDetail<any>> 是什么意思?

“ function():any {”是什么意思

为什么可以在不先强制转换的情况下将“ any”分配给任何类型?

警告C4309-这是什么意思,在这种情况下可以忽略吗?

Ruby-Array.any?(&:nil?)是什么意思?

此打字稿摘要中的“(this as any)”是什么意思?

在 TypeScript 中 any[]=[] 数据类型是什么意思?

类型 { [x: string]: any } 是什么意思?

TypeScript。这是什么意思:(<any>((()=> true))

在这种情况下,为什么编译器无法确定操作数的类型?

为什么在这种情况下编译器不使用Numeric.plus?

在这种情况下,编译器为什么无法解析实例方法的符号?

在这种情况下,编译器为什么无法解析实例方法的符号?

在这种情况下,编译器为什么无法解析实例方法的符号?

在这种情况下,为什么F#编译器无法推断类型?

在这种情况下,编译器为什么不能限制返回类型

使用LINQ方法Any()时,为什么C#编译器会创建私有DisplayClass,如何避免呢?

在这种情况下,为什么编译器会选择不正确的函数重载?

在这种情况下,为什么编译器要专门用于存储冗余变量的内存位置?

为什么在没有真值的情况下any()返回NA

什么是“ ANY”,它与“ Any”有什么不同?

为什么Java的,允许该编译的,什么是它在这种情况下解释多+迹象?

为什么在dlopen函数中传递的std :: any的std :: any_cast会引发错误

> =在这种情况下是什么意思

在这种情况下 res 是什么意思?

在这种情况下,语法[]是什么意思?

在这种情况下,`typedef`是什么意思

在这种情况下,括号是什么意思?