Scala使用泛型类型重载运算符

时间:2018-05-09 17:33:01

标签: arrays scala generics matrix operator-overloading

我正在scala做一个项目,我正在努力解决某个问题。我正在制作一个矩阵DSL,所以我正在重载一些运算符,如+, - 或*,以便我能做到:

matrixMult = matrix1*matrix2

我做了这个类,其中矩阵表示为Array [Array [Double]]类型,但我想使它通用:Array [Array [T]]

事情是我不知道如何在类方法中处理这个问题,因为对于像+, - 和*这样的操作。它应该适用于双打或整数,但字符串应该抛出错误。这是我目前的代码:

  def +(other : Matrix[Double]): Matrix[Double] = {
  var array = new Array[Array[Double]](rows)
  for (i <- 0 to (rows - 1)) {
    var arrayRow = new Array[Double](columns)
    for (j <- 0 to (columns - 1)) {
      arrayRow(j) = this.array(i)(j) + other.array(i)(j)
    }
    array(i) = arrayRow
  }
  return new Matrix(array)

}

我在arrayRow(j)= ...行上出错是正常的,因为它不知道&#34;这个&#34;对象是。 我应该怎么做才能使这项工作?就像我希望这个方法只能访问双精度(或整数)而不是字符串,如果要在Matrix [String]对象上调用此方法,它应该抛出一个错误。我尝试使用isInstanceOf()进行模式匹配,但是没有删除错误,我无法编译。

如果我班上的所有方法都有同样的问题,那么如果可能的话,我想要一个通用的答案。

感谢任何帮助, 非常感谢你!

2 个答案:

答案 0 :(得分:1)

不确定您使用的是哪个版本的Scala,但是如果您使用的是2.8,我在Scala-lang上找到了这个帖子,看起来您可能可以使用T:Numerics将其限制为Int,Long ,浮动,双。

在线程中稍微向下,将它限制为JUST的一部分(如Int,Double),他们说要定义自己的通用Trait。 https://www.scala-lang.org/old/node/4787

答案 1 :(得分:0)

答案可以在评论中找到:

之前已经询问并回答了Matrix添加。即使问题具有不同的矩阵实现,我相信来自可靠的Rex Kerr的答案仍然适用。 - jwvh