gpt4 book ai didi

generics - 在 Kotlin 中实例化泛型数组

转载 作者:IT老高 更新时间:2023-10-28 13:33:21 27 4
gpt4 key购买 nike

为什么这不能编译?我在 3 行得到编译错误

Cannot use T as reified type parameter. Use class instead

class Matrix2d<T>(val rows: Int, val cols: Int, init: (Int, Int) -> T) {

var data = Array(rows * cols, { i ->
val r = Math.floor(i.toDouble() / cols).toInt()
init(r, i - r * cols)
})

operator fun get(row: Int, col: Int): T = data[row * cols + col]

operator fun set(row: Int, col: Int, v: T) = {
data[row * cols + col] = v
}
}

解决方案

我添加了一个工厂函数,它看起来像第二个构造函数,但在内联函数中实现

class Matrix2d<T>(val rows: Int, val cols: Int, private val data: Array<T>) {

companion object {
operator inline fun <reified T> invoke(rows: Int, cols: Int, init: (Int, Int) -> T): Matrix2d<T> {
return Matrix2d(rows, cols, Array(rows * cols, { i ->
val r = Math.floor(i.toDouble() / cols).toInt()
init(r, i - r * cols)
}))
}
}

init {
if (rows * cols != data.size) throw IllegalArgumentException("Illegal array size: ${data.size}")
}

operator fun get(row: Int, col: Int): T = data[row * cols + col]

operator fun set(row: Int, col: Int, v: T) {
data[row * cols + col] = v
}
}

最佳答案

Kotlin 数组映射到的 JVM 数组要求在编译时知道元素类型以创建数组实例。

所以你可以实例化 Array<String>Array<Any> ,但不是 Array<T>在哪里 T是一个类型参数,表示在编译时删除的类型,因此是未知的。要指定类型参数必须在编译时已知,它用 reified 标记。修饰符。

有几种选择,在这种情况下你可以做什么:

  1. 使用MutableList<T>用于存储元素,不需要reified T:

    // MutableList function, available in Kotlin 1.1
    val data = MutableList(rows * cols, { i ->
    val r = i / cols
    init(r, i % cols)
    })
    // or in Kotlin 1.0
    val data = mutableListOf<T>().apply {
    repeat(rows * cols) { i ->
    val r = i / cols
    add(init(r, i % cols))
    }
    }
  2. 从具有具体类型参数的内联函数创建数组:

    inline fun <reified T> Matrix2d(val rows: Int, val cols: Int, init: (Int, Int) -> T) = 
    Matrix2d(rows, cols, Array(rows * cols, { .... })

    class Matrix2d<T>
    @PublishedApi internal constructor(
    val rows: Int, val cols: Int,
    private val data: Array<T>
    )
  3. 使用Array<Any?>作为存储,并将其值转换为 Tget功能:

    val data = Array<Any?>(rows * cols, { .... })

    operator fun get(row: Int, col: Int): T = data[row * cols + col] as T
  4. 传递 Class<T> 类型的参数或 KClass<T>构造函数并使用java反射创建数组的实例。

关于generics - 在 Kotlin 中实例化泛型数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41941102/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com