在kotlin中创建一个类型为Comparable <t>的数组的泛型类?

时间:2016-07-11 05:03:18

标签: generics kotlin

Create generic 2D array in Kotlin的启发,我有以下代码创建一个类型为T的数组的泛型类。但是,一旦我添加了一个上限,我就会遇到编译错误。有没有办法做到这一点?

//This code compiles:
class GenericClass<T> protected constructor(size : Int, arrayFactory: (Int) -> Array<T>) {
  companion object {
    inline fun <reified T> invoke(size : Int)
       = GenericClass(size, { size -> arrayOfNulls<T>(size) })
  }
  val array = arrayFactory(size)
}

//Compile errors:
class GenericClass<T : Comparator<T>> protected constructor(size : Int, arrayFactory: (Int) -> Array<T>) {
  companion object {
    inline fun <reified T : Comparator<T>> invoke(size : Int)
       = GenericClass(size, { size -> arrayOfNulls<T>(size) })
  }
  val array = arrayFactory(max)
}

编译错误是:

  • 构造函数GenericClass中的T的类型参数绑定&gt;(size:Int,arrayFactory:(Int) - &gt; Array)不满足:推断类型T?不是Comparator的子类型

1 个答案:

答案 0 :(得分:3)

错误消息时的错误消息暗示它是关于类型参数和参数的可空性约束。更改GenericClass构造函数以允许null内的Array,如下所示:

class GenericClass<T : Comparator<T>> 
  protected constructor(size : Int, arrayFactory: (Int) -> Array<T?>) {
    companion object {
        inline fun <reified T : Comparator<T>> invoke(size : Int)
            = GenericClass(size, { size -> arrayOfNulls<T>(size) })
    }
    val array = arrayFactory(size)
}

arrayOfNulls正如名称所示,会创建一个充满size的给定null数组。因此,如果您想使用它,arrayFactory需要接受它。