Если вы хотите, чтобы 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 определения чисел.