Array <T?>是什么意思
将Java代码转换为Kotlin时,
public MayData[] getDataArray() { return new MayData[0]; }
变成
fun getDataArray(): Array<MyData> { return arrayOfNulls<MyData>(0) }
但我得到一个错误:
Error:(50, 16) Type mismatch: inferred type is Array<MyData?> but Array<MyData> was expected
它必须添加'?'
fun getDataArray(): Array<MyData?> { return arrayOfNulls<MyData>(0) }
“?”是什么? 是指模板类型?
return arrayOfNulls<MyData>(0)
这一行意味着什么:
-
arrayOfNulls
返回N个元素的数组(在你的情况下为零),但是用null填充 - 数据类型是
MyData
,不可为空
因此,您创建一个具有null
值的数组(即使大小为零),但DataType不可为空:
两种解决方案
// zero elements in the array but not nullable fun getDataArray(): Array<MyData> { return arrayOf() } // array with nullable data-type fun getDataArray(): Array<MyData?> { return arrayOfNulls<MyData?>(0) }
arrayOfNulls
返回一个由null
值初始化的对象数组。 '?' 意味着该对象可能为null
。
T
是通用的 。 ?
标记为可空的类型。 在Kotlin中,您可以区分可以为null的类型和不可以的类型。
由于在Java中除原子( int
, long
, float
…)以外的所有类型都可以为null,所以需要添加?
运营商也要处理这个案例。
- 您需要知道,在Kotlin中,每个类都可以使用两种变体:可以是空的,也可以是不可空的。 例如,
String
类可以用于String
或String?
类型,前者意思是“非空”,后者意思是“可空”。 -
<>
字符引入了一个“泛型”,例如对于一个Array<String>
这意味着这个数组只能容纳String
类型的对象,而Array<String?>
意味着它可以容纳String
和null
实例。那。 - 当你使用
arrayOfNulls
函数的返回类型是Array<MyData?>
,这就是为什么编译器抱怨:
推断的类型是Array,但Array是预期的Blockquote
为了解决这个问题,你可以让你的函数返回可为空的版本,就像你已经做的那样,或者你不使用arrayOfNulls
,当你确定你不想在你的数组中包含null
。
fun getDataArray(): Array<MyData?> { return arrayOfNulls<MyData>(0) }
要么
fun getDataArray(): Array<MyData> { return arrayOf<MyData>() }