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
相关产品推荐
相关产品推荐

