, Required Array<*>?"-6ren"> , Required Array<*>?"-我遇到了 Kotlin 类型系统的问题。我在类范围内声明了如下变量: var planets: ArrayList? = null 在构造函数中,我尝试初始化数组,但遇到类型不匹配错误: planet-6ren">
gpt4 book ai didi

Kotlin 类型推断失败 - 类型不匹配 "Found Array<*?>, Required Array<*>?"

转载 作者:IT老高 更新时间:2023-10-28 13:40:02 28 4
gpt4 key购买 nike

我遇到了 Kotlin 类型系统的问题。我在类范围内声明了如下变量:

var planets: ArrayList<Planet>? = null

在构造函数中,我尝试初始化数组,但遇到类型不匹配错误:

planets = arrayListOf(earth, mars, saturn, jupiter, uranus, neptune, pluto)

错误:

Required: ArrayList<Planet>?
Found: ArrayList<Planet?>

为什么会出现此错误,如何解决?

最佳答案

至少有一个行星 (earth, mars, saturn, jupiter, uranus, neptune, pluto) 是可空类型 Planet?因此推断的类型为 arrayListOf(earth, ...)ArrayList<Planet?> .

自从 ArrayList<Planet>在类型 Planet 上不是逆变的它不能被安全地赋值为 ArrayList<Planet?> .

要解决问题,您可以:

  • 确保所有行星都属于不可为空的类型 Planet
  • 如果以上不可行改变

    var planets: ArrayList<Planet>? = null

    var planets = arrayListOf<Planet?>()
  • 过滤掉null行星,然后将结果集合分配给 planets :

    planets = arrayListOf(*arrayListOf(earth, ...).filterNotNull().toTypedArray())

另一种让编译器满意的方法是使 planets contravariant像这样:

var planets: ArrayList<in Planet>? = null

PS。使用kotlin collection types List<T> , Set<T>和相应的listOf , setOf尽可能代替 Java 的对应物。

关于Kotlin 类型推断失败 - 类型不匹配 "Found Array<*?>, Required Array<*>?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39343267/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com