Как написать метод для принятия произвольных классов в Scala - PullRequest
0 голосов
/ 24 июня 2018

Как правильно написать метод, работающий с любым классом? у которого определена операция сложения?

Я представлял, что это было что-то вроде

def trajectory[A <: {def +(a:A):A}](a:A): A = {
    a + a
}

но это не работает.

1 Ответ

0 голосов
/ 24 июня 2018

Я бы пошел с классом типа :

trait Semigroup[A] {
  def mappend(a0: A, a: A): A
}

object Semigroup {
  implicit val intAdditionSemigroup: Semigroup[Int] = new Semigroup[Int] {
    override def mappend(a0: Int, a: Int): Int = a0 + a
  }
}

Когда вы хотите использовать его, вы добавляете его как неявное ограничение на параметр типа:

def foo[A](a0: A, a: A)(implicit semigroup: Semigroup[A]): A = {
  semigroup.mappend(a0, a)
}
...