2015-10-13 101 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 
相关问题