Разный метод toString для разных типов классов - PullRequest
0 голосов
/ 07 мая 2020

Мне нужно, чтобы метод toString отличался для строк и для чисел (Int, Double, Float). Для строк он просто преобразуется в строку, а для чисел он умножает каждый элемент списка на число и преобразует в строку. Когда я пытаюсь заставить его работать хотя бы для Int, он говорит: «Метод toString ничего не отменяет».

class Seq[T : Ordering] (initialElems: T*) {
  override def toString(implicit ev: T <:< Int): String = {
    elems.foreach((i:T) => fac(factors)*i).toString
  }

  val elems = initialElems.sorted

  def concat(a:Seq[T]) = new Seq(a.elems ++ this.elems:_*)

  val factors = ListBuffer[Int](1)

  def fac(xs: ListBuffer[Int]): Int = {
    var i=0
    var sum = 1
    while (i < xs.length) {
      sum *= xs(i)
      i += 1
    }
    sum
  }

  def multy(a: Int)(implicit ev: T <:< AnyVal): Unit = {
    factors += a
  }
}

1 Ответ

2 голосов
/ 07 мая 2020

.foreach возвращает Unit, поэтому вместо него должно быть .map.

Попробуйте определить класс типа и передать неявный параметр с уровня метода на уровень класса

trait ToStr[T] {
  def apply(factors: ListBuffer[Int], fac: ListBuffer[Int] => Int, elems: T*): String
}
object ToStr {
  implicit val int: ToStr[Int] = 
    (factors, fac, elems) => elems.map((i: Int) => fac(factors) * i).toString
  implicit val str: ToStr[String] = (_, _, elems) => elems.toString
}

class Seq[T : Ordering] (initialElems: T*)(implicit toStr: ToStr[T]) {

  override def toString: String = toStr(factors, fac, elems: _*)

  ...
}

В противном случае def toString(implicit ev: T <:< Int): String действительно не отменяет def toString: String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...