我有某种类型的变量,我想从伴随对象中获取信息。例如,我想我可以做这样的事情:
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
结果为 :Long
,这使得与 i: I
的比较变得复杂。
我希望我能找到一些简洁而直接的东西,但我怀疑这需要反射(reflection),而这通常两者都不是。
最佳答案
您可以使用类型类来获取最小值:
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
关于scala - 访问类型的伴生对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33112637/