在scala中键入类型参数的伴随对象的约束

时间:2013-02-25 15:45:00

标签: scala

我想定义一个名为ExtendedNumber的参数化类,它将采用某种形式的整数,如Int或Byte,并扩展它以包含无穷大,-infinity和null。特别是,我想使用MaxValue来表示无穷大。如果MaxValue是静态成员,我相信我可以这样做:

class ExtendedNumber[T <: {val MaxValue : T}] {
  val infinity = T.MaxValue
  ...
}

但是,由于MaxValue是在伴随对象中定义的,我相信我需要在伴随对象上放置一个类型约束。这可能吗?我也对一般问题的其他解决方案持开放态度。

1 个答案:

答案 0 :(得分:3)

一般解决方案是添加类型类,例如:

trait ExtendedNumber[T] {
  def infinity: T
}

implicit object extendedInt extends ExtendedNumber[Int] {
  def infinity = Int.MaxValue
}

def foo[T](v: T)(implicit en: ExtendedNumber[T]) = v == en.infinity