Scala - 从泛型类型构造方法名称?

时间:2011-04-25 15:47:35

标签: generics scala

我有以下方法:

def toNumber[T <: AnyVal](value:String, default:T)(implicit n: Numeric[T]):T = {
    val str = value.trim
    var s = n.zero
    if (value.trim.isEmpty) {
      default
    } else {
      if (default.isInstanceOf[Long])
        s = n.plus(n.zero,str.toLong.asInstanceOf[T])
      else if (default.isInstanceOf[Int])
        s = n.plus(n.zero,str.toInt.asInstanceOf[T])
    }
    s
  }

是否有可能以某种方式简化这一点,以便它查看T的类型(例如Int,Long等)并使用它来调用正确的“to”方法(例如toInt,toLong等)?

作为一个额外的问题,我能以某种方式将T限制为Int和Long而不是AnyVal的任何子类吗?

谢谢, 约翰

1 个答案:

答案 0 :(得分:10)

如果您想将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