2013-02-25 137 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