Если вы хотите ограничить T
определенными числовыми экземплярами, было бы неплохо предоставить свой собственный класс типов (таким образом, предоставив ответ на ваш первоначальный вопрос):
trait Natural[T] { def from(s : String) : T }
implicit object IntNatural = new Natural[Int] {
def from(s : String) = s.toInt
}
implicit object LongNatural = new Natural[Long] {
def from(s : String) = s.toLong
}
Тогда ваш метод:
def toNumber[T : Natural](value : String, default : T) : T =
if (value.trim.isEmpty)
default
else
implicitly[Natural[T]].from(value.trim)
<ч />
Однако я бы лично переписал подпись этого метода как:
def natural[T : Natural](value : String) : Option[T]
И тогда пользователи будут использовать getOrElse default
на сайте использования. Например:
natural[Int]("42") getOrElse 23