1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
trait Matrix[@specialized A, Repr[C] <: Matrix[C, Repr]] { // crash goes away if @specialize is removed
def duplicate(mb: MatrixBuilder[A, Repr]): Repr[A] = {
mb.zeros
}
}
trait DenseMatrix[@specialized A] extends Matrix[A, DenseMatrix]
trait DenseMatrixFlt extends DenseMatrix[Float]
trait MatrixBuilder[@specialized A, Repr[C] <: Matrix[C, Repr]] {
def zeros: Repr[A]
}
object DenseFloatBuilder extends MatrixBuilder[Float, DenseMatrix] {
val zeros = new Object with DenseMatrixFlt
// Note:
// - in 2.9 crash goes away if the explicit type "DenseMatrixFlt" is assigned to "zeros"
// - in 2.9 crash goes away if DenseMatrixFlt is a class instead of a trait:
// val zeros = new DenseMatrixFlt
}
object Test extends App {
val m1 = DenseFloatBuilder.zeros // in 2.9 crash goes away if explicit type "DenseMatrixFlt" is assigned to m1
val m2 = m1.duplicate(DenseFloatBuilder)
}
|