2013-02-25 226 views
2

我想定义一个名为ExtendedNumber的参数化类,它将采用某种形式的整数(如Int或Byte),并将其扩展为包含无穷大,无穷和空值。特别是,我想用MaxValue来表示无穷大。如果MaxValue的是一个静态成员,我相信我会做这样的事情:类型参数在scala中伴随对象的类型约束

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

然而,由于MaxValue的是同伴对象定义,我认为我需要把一个类型约束同伴对象。这可能吗?我也对一般问题的其他解决方案开放。

+2

,我不相信你可以直接约束同伴对象,因为同伴是不是真正的类型系统的一部分,而是一个放松当一个类和一个对象之间存在某种词汇关系时,访问规则的一部分。同伴也会在隐式解析规则中得到反映,我想可以想象,您可以通过某种方式来接入。但是我会考虑使用上下文绑定来将“无穷大”,“无穷大”等值(可能为0)的值传递给“ExtendedNumber”。 – 2013-02-25 15:56:04

回答

2

一般的解决方法是增加一个类型的类,例如:

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 
相关问题