我遇到了Kotlin类型系统的问题.我在类范围声明了变量如下:
var planets: ArrayList<Planet>? = null
Run Code Online (Sandbox Code Playgroud)
并在构造函数中我尝试初始化数组但我遇到类型不匹配错误:
planets = arrayListOf(earth, mars, saturn, jupiter, uranus, neptune, pluto)
Run Code Online (Sandbox Code Playgroud)
错误:
Required: ArrayList<Planet>?
Found: ArrayList<Planet?>
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误,如何解决?
行星(earth, mars, saturn, jupiter, uranus, neptune, pluto
)中的至少一个是可空类型,Planet?
因此推断类型arrayListOf(earth, ...)
是ArrayList<Planet?>
.
由于ArrayList<Planet>
不是类型的逆变,Planet
因此不能安全地赋值ArrayList<Planet?>
.
要解决此问题,您可以:
Planet
如果以上不可行的改变
var planets: ArrayList<Planet>? = null
Run Code Online (Sandbox Code Playgroud)
至
var planets = arrayListOf<Planet?>()
Run Code Online (Sandbox Code Playgroud)过滤掉null
行星,然后将结果集合分配给planets
:
planets = arrayListOf(*arrayListOf(earth, ...).filterNotNull().toTypedArray())
Run Code Online (Sandbox Code Playgroud)使编译器满意的另一种方法是使planets
逆变器如下:
var planets: ArrayList<in Planet>? = null
Run Code Online (Sandbox Code Playgroud)
PS.使用科特林集合类型 List<T>
,Set<T>
以及相应的listOf
,setOf
而不是Java的同行只要有可能.
归档时间: |
|
查看次数: |
8564 次 |
最近记录: |