Перегрузочные операторы Scala с универсальными типами - PullRequest
0 голосов
/ 09 мая 2018

Я делаю проект в 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) = ..., которая нормальна, потому что она не знает, к какому типу относится этот объект. Что я должен сделать, чтобы сделать эту работу? Как я хотел бы, чтобы этот метод был доступен только для двойных (или целых) значений, а не для строк, если этот метод должен вызываться для объекта Matrix [String], он должен выдавать ошибку. Я попытался сопоставить шаблон с isInstanceOf (), но это не устраняет ошибку, и я не могу скомпилировать.

Если у меня есть такая же проблема со всеми моими методами в моем классе, поэтому я хотел бы получить общий ответ, если это возможно.

Любая помощь приветствуется, Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Ответ можно найти в комментариях:

Матрица дополнения была запрошена, и ответил, прежде. Несмотря на то, что вопрос имеет другую матричную реализацию, я думаю, что ответ от грозного Рекса Керра все еще применим. - JWVH

0 голосов
/ 09 мая 2018

Не уверен, какую версию Scala вы используете, но если вы используете 2.8, я нашел эту ветку на Scala-lang, и похоже, что вы можете использовать T: Numerics, чтобы ограничить ее Int, Long, Поплавок, двухместный.

Чуть дальше в потоке, чтобы ограничить его ТОЛЬКО подмножеством из них (например, Int, Double), они говорят, что определяют вашу собственную общую черту.https://www.scala -lang.org / старый / узел / 4787

...