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中除原子( intlongfloat …)以外的所有类型都可以为null,所以需要添加? 运营商也要处理这个案例。

  1. 您需要知道,在Kotlin中,每个类都可以使用两种变体:可以是空的,也可以是不可空的。 例如, String类可以用于StringString? 类型,前者意思是“非空”,后者意思是“可空”。
  2. <>字符引入了一个“泛型”,例如对于一个Array<String>这意味着这个数组只能容纳String类型的对象,而Array<String?>意味着它可以容纳Stringnull实例。那。
  3. 当你使用arrayOfNulls函数的返回类型是Array<MyData?> ,这就是为什么编译器抱怨:

推断的类型是Array,但Array是预期的Blockquote

为了解决这个问题,你可以让你的函数返回可为空的版本,就像你已经做的那样,或者你不使用arrayOfNulls ,当你确定你不想在你的数组中包含null

 fun getDataArray(): Array<MyData?> { return arrayOfNulls<MyData>(0) } 

要么

 fun getDataArray(): Array<MyData> { return arrayOf<MyData>() }