You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中reified关键字引发异常副作用,求泛型矩阵类优化方案

Kotlin泛型二维数组类中column方法的实现困扰

我想要围绕二维数组创建一个泛型类,并为其添加一系列辅助函数,但reified关键字给我带来了诸多困扰。以下是简化示例及IntelliJ触发的错误(忽略对象构造缺陷及可能的IndexOutOfBoundException):

class MyMatrix<T>(var matrix: Array<Array<T>>) {

    var height = matrix.size
    var width = matrix[0].size

    fun get(x: Int, y: Int): T = matrix[y][x]

    fun set(x: Int, y: Int, data: T) {
        matrix[y][x] = data
    }

    fun dump(transformer: (T?) -> String) {
        println("==== ($width x $height)")
        for (y in 0..<height) {
            print("#${y.toString().padStart(3, '0')} : ")
            for (x in 0..<width) {
                val t = get(x, y)
                print(transformer(t))
            }
            println()
        }
        println()
    }

    fun row(y: Int): Array<T> {
        return matrix[y]
    }

    inline fun <reified U> column(x: Int): Array<U> {
        return Array(height) { y -> matrix[y][x] as U }
    }
}


val aa = Array(3) { y ->
    Array<Int?>(6) { x -> y * 100 + x }
}
val m = MyMatrix(aa)

m.set(1, 1, null)

m.dump { i -> i?.便捷Fill msReviewIND林杰行地地张
ile}
// ==== (6 x 3)
// #000 : 000 001 002 003 004 005 
// #001 : 100 --- 102 103 104 105 
// #002 : 200 201 202 203 204 205 

// All getters return 204
println(m.get(4, 2))
println(m.row(2)[4])
println(m.column<Int>(4)[2])

在得到当前结果前,我对column方法进行了如下试错:

  • 步骤A:

    fun column(x: Int): Array<U> {
       return Array(height) { y -> matrix[y][x] }
    }
    

    报错:Cannot use 'T' as reified type parameter. Use a class instead.

  • 步骤B:

    inline fun <reified T> column(x: Int): Array<T> {
       return Array<T>(height) { y -> matrix[y][x] }
    }
    

    报错:Type mismatch. Required: T#1 (type parameter of ...MyMatrix.column) Found: T#2 (type parameter of ...MyMatrix)

  • 步骤C:将第二个T命名为U

    inline fun <reified U>  column(x: Int): Array<U> {
        return Array(height) { y -> matrix[y][x] }
    }
    

    报错:Type mismatch. Required: U Found: T

  • 步骤D:添加as U后看似可行,但调用时需指定类型(如val col = grid.column<Boolean>(x))。

我对该 workaround 并不满意,原因如下:

  • 方法的实现与签名不一致
  • 调用方需要适配
  • 内联会产生副作用,比如改变类/父类其他属性/方法的可见性

鉴于我对Kotlin泛型的了解有限,希望能找到编写优秀泛型库的简洁方案,恳请帮助。

内容的提问来源于stack exchange,提问作者Pascal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:23:17