2015-10-13 167 views
2

我有一個類型的變量,我想從伴侶對象獲取信息。例如,我想我也許能夠做這樣的事情:訪問類型的伴侶對象

def foo[I: Integral](i:I): = { 
    val minVal = i match { 
    case _:Byte => Byte.MinValue 
    case _:Char => Char.MinValue 
    case _:Int => Int.MinValue 
    case _:Long => Long.MinValue 
    case _:Short => Short.MinValue 
    } 
    // compare i and minVal 
} 

但是,這是相當冗長和minVal出來爲:Longi: I複雜的比較。

我希望能找到簡潔明瞭的東西,但我懷疑這需要反思,而這往往不是。

回答

4

你可以使用一個類型的類來獲得的最少值:

trait MinValue[T] { def minValue: T } 
object MinValue { 
    implicit val minByte = new MinValue[Byte] { def minValue = Byte.MinValue } 
    implicit val minChar = new MinValue[Char] { def minValue = Char.MinValue } 
    implicit val minLong = new MinValue[Long] { def minValue = Long.MinValue } 
    implicit val minInt = new MinValue[Int] { def minValue = Int.MinValue } 
} 

我們可以使用這種類型的類來獲得的最少值傳遞給foo函數值的類型:

def foo[I: Integral](i: I)(implicit min: MinValue[I]) = 
    implicitly[Integral[I]].compare(i, min.minValue) 
// or 
def foo2[I: Integral: MinValue](i: I) = { 
    val minVal = implicitly[MinValue[I]].minValue 
    implicitly[Integral[I]].compare(i, minVal) 
} 

foo(5) // Int = 1 
foo(Int.MinValue) // Int = 0 

foo2(-127.toByte) // Int = 1 
foo2(-128.toByte) // Int = 0