Причина этих ошибок заключается в том, что декларировать это не безопасно, как вы делаете.Например, можно было бы сделать это, в противном случае:
class A(val x: Int)
class B(x: Int, val y: Int) extends A(x)
object NA extends Numeric[A] {
def toDouble(x: A): Double = x.x.toDouble
def toFloat(x: A): Float = x.x.toFloat
def toLong(x: A): Long = x.x.toLong
def toInt(x: A): Int = x.x
def fromInt(x: Int): A = new A(x)
def negate(x: A): A = new A(-x.x)
def times(x: A,y: A): A = new A(x.x * y.x)
def minus(x: A,y: A): A = new A(x.x - y.x)
def plus(x: A,y: A): A = new A(x.x + y.x)
def compare(x: A,y: A): Int = implicitly[Numeric[Int]].compare(x.x, y.x)
}
object NB extends Numeric[B] {
def toDouble(x: B): Double = x.x.toDouble / x.y.toDouble
def toFloat(x: B): Float = x.x.toFloat / x.y.toFloat
def toLong(x: B): Long = (x.x / x.y).toLong
def toInt(x: B): Int = x.x / x.y
def fromInt(x: Int): B = new B(x, 1)
def negate(x: B): B = new B(-x.x, x.y)
def times(x: B,y: B): B = new B(x.x * y.x, x.y * y.y)
def minus(x: B,y: B): B = new B(x.x * y.y - y.x * x.y, x.y * y.y)
def plus(x: B,y: B): B = new B(x.x * y.y + y.x * x.y, x.y * y.y)
def compare(x: B,y: B): Int = implicitly[Numeric[Int]].compare(x.x * x.y, y.x * y.y)
}
val mb = Matrix.tabulate(10, 10)((x, y) => new B(x, y))
def f(m: Matrix[A]) = {
val ma = Matrix.tabulate(m.nRows, m.nColumns)((x, y) => 1)
m + ma
}
f(mb)
Обратите внимание, что m + ma
не может работать, поскольку m.+
ожидает объект типа B
.Если бы Scala позволил вам написать это так, как вы это сделали, то это было бы разрешено.
Обычный способ избежать этой проблемы - написать такой метод:
def +[B >: A](that: Matrix[B])(implicit num: Numeric[B]): Matrix[B] = this.zipWith(that)(B.plus)