受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)
}
编译错误是:
答案 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
需要接受它。