Why is this not compiling? I get a compilation error in line 3
You cannot use the T parameter as a reified type. Use a 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 } }
Decision
I added a factory function that looks like a second constructor, but implemented in an inline function
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 } }
generics kotlin
Lancaster
source share