Функция в классе generi c - PullRequest
0 голосов
/ 07 мая 2020
• 1000 Строки val не должны.
import scala.collection.mutable.ListBuffer

object Main extends App{
  val strings = new Seq("f", "d", "a")
  val numbers = new Seq(1,5,4,2)
  val strings2 = new Seq("c", "b")
  numbers.multy(5)
  strings.multy(5)
  val strings3 = strings2.concat(strings)
  println(strings3)
  println(numbers)
}


class Seq[T : Ordering] (initialElems: T*) {
  override def toString: String = elems.toString

  val factors = ListBuffer[Number](1)

  val elems = initialElems.sorted

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

  def multy[T <: Number](a:Number) = {
    factors += a;
  }
}

1 Ответ

1 голос
/ 07 мая 2020

Если вы хотите, чтобы scala.Int, scala.Long, scala.Double, et c не поддерживались - потому что они не расширяют Number - вы можете определить метод как

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

Однако, учитывая, что под капотом они могут расширяться Number (если компилятор решает, что он должен компилировать их как объекты, а не как примитивы), использование класса типа будет работать лучше:

trait IsNumber[T] {
  def asNumber(value: T): Number
}
object IsNumber {
  implicit def numbersAreNumbers[T <: Number]: IsNumber[T] = t => t

  implicit val intIsNumber: IsNumber[Int] = i => (i: Number)
  ... // the same for Long, Short, etc
}

, который может использоваться в качестве доказательства

def multy(a: Number)(implicit ev: IsNumber[T]): Unit = {
  factors += a
}

и как обычный класс типа в коде, которому для чего-то понадобятся эти знания:

def doSomethingWithElements(implicit isNumber: IsNumber[T]) = {
  elems.map(isNumber.asNumber).toList // List[Number]
}

Это поддержит оба java.lang.* Number s, а также Scala определения чисел.

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