Array <t?>是什么意思

时间:2017-09-05 12:28:36

标签: android arrays generics kotlin

将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)
}

“?”对模板类型意味着什么?

4 个答案:

答案 0 :(得分:2)

arrayOfNulls返回一个对象数组,初始化为null个值。 '?'表示对象可能是null

答案 1 :(得分:1)

Tgeneric?将类型标记为可为空。在Kotlin中,您可以区分可以为null的类型和不可以为null的类型。

由于在Java中除了原子类型(intlongfloat ...)之外的所有类型都可以为null,因此需要添加?运算符来处理也是这种情况。

答案 2 :(得分:1)

return arrayOfNulls<MyData>(0)

这一行意味着什么:

  • arrayOfNulls返回N个元素的数组(在您的情况下为零),但填充为null
  • <MyData>数据类型为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)
}

答案 3 :(得分:1)

  1. 您需要知道在Kotlin中,每个类都可以使用两种变体:可空和非可空。例如,类String可用于StringString?类型,前者表示“非空”,后者表示“可空”。
  2. <>字符引入了“通用类型”,例如对于Array<String>这意味着,此数组只能保存String类型的对象,而Array<String?>表示它可以保存Stringnull的实例那个。
  3. 当您使用arrayOfNulls时,函数的返回类型将为Array<MyData?>,这就是编译器抱怨的原因:
  4.   

    推断类型是Array但是期望Array   块引用

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

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

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