【问题标题】:what does Array<T?> meanArray<T?> 是什么意思
【发布时间】:2017-09-05 12:28:35
【问题描述】:

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

模板类型中的“?”是什么意思?

【问题讨论】:

  • ?将类型标记为可为空。在 Kotlin 中,您可以区分可以为 null 的类型和不能为 null 的类型。
  • T?是 Kotlin 可空类型,Array 只是表示集合可以包含空值
  • 感谢您的解释,但不确定为什么提出问题会得到“-2”,如果提供问题的人可以解释会更有帮助。

标签: android arrays generics kotlin


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    return arrayOfNulls<MyData>(0)
    

    这行是什么意思:

    • arrayOfNulls 返回一个包含 N 个元素的数组(在您的情况下为零),但用 null 填充它
    • &lt;MyData&gt; Data-Type 是 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】:

      T 是一个generic。 ? 将类型标记为可为空。在 Kotlin 中,您可以区分可以为 null 的类型和不能为 null 的类型。

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

      【讨论】:

        【解决方案4】:
        1. 您需要知道,在 Kotlin 中,每个类都可以在两种变体中使用:可空的和不可空的。例如,String 类可用于String 或String? 类型,前者表示“非空”,后一个表示“可空”。
        2. &lt;&gt; 字符引入了“通用类型”,例如对于Array&lt;String&gt;,这意味着该数组只能容纳String 类型的对象,而Array&lt;String?&gt; 意味着它可以容纳String 和null 的实例。
        3. 当您使用arrayOfNulls 时,函数的返回类型将是Array&lt;MyData?&gt;,这就是编译器抱怨的原因:

        推断类型为 Array 但应为 Array 块引用

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

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

        或

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

        【讨论】:

          猜你喜欢
          • 2013-08-31
          • 2010-11-19
          • 2021-11-16
          • 2012-05-04
          • 2019-11-17
          • 1970-01-01
          • 1970-01-01
          • 2021-10-29
          • 1970-01-01
          相关资源
          最近更新 更多