如何在类构造函数中调用泛型类型的构造函数

lik*_*ern 1 generics kotlin

我想创建具有以下属性的Matrix2D类:

  1. 类应该是通用的
  2. 应该能够接受尽可能多的类型(理想情况下是所有类型)
  3. “默认”构造函数应使用默认类型值初始化所有单元格
  4. 正确处理大小写,当类型没有默认构造函数时(可能是默认参数解决了此问题)

我该怎么做?这是我的草图:

class Matrix2D<T> : Cloneable, Iterable<T> {
    private val array: Array<Array<T>>
    // Call default T() constructor if it exists
    // Have ability to pass another default value of type
    constructor(rows: Int, columns: Int, default: T = T()) {
        when {
            rows < 1 -> throw MatrixDimensionException("Number of rows should >= 1")
            columns < 1 -> throw MatrixDimensionException("Number of columns should be >= 1")
        }
        array = Array(rows, { Array(columns, { default }) })
    }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 5

无法在编译时检查类是否具有默认构造函数。我可以通过传递创建给定类型实例的工厂来解决此问题:

class Matrix2D<T : Any> : Cloneable, Iterable<T> {
  private val array: Array<Array<Any>>

  constructor(rows: Int, columns: Int, default: T) :
      this(rows, columns, { default })

  constructor(rows: Int, columns: Int, factory: () -> T) {
    when {
      rows < 1 -> throw MatrixDimensionException("Number of rows should >= 1")
      columns < 1 -> throw MatrixDimensionException("Number of columns should be >= 1")
    }
    array = Array(rows) { Array<Any>(columns) { factory() } }
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,T在这种情况下不能使用类型数组,因为有关其实际类型的信息会在运行时删除。只需在必要时使用数组Any并将其转换为实例T