是否有可能得到未知T型的MinValue
-或MaxValue
?就像有Int.MinValue
和Int.MaxValue
的Int
一样??
谢谢
正如@mpilquist在上面的评论中所说,您可以使用Haskell创建一个Bounded
类型的类。
代码示例:
trait Bounded[A] {
def minValue: A
def maxValue: A
}
object Bounded {
def apply[A](min: A, max: A) = new Bounded[A] {
def minValue = min
def maxValue = max
}
implicit val intBounded = Bounded(Int.MinValue, Int.MaxValue)
implicit val longBounded = Bounded(Long.MinValue, Long.MaxValue)
}
object Main {
def printMinValue[A : Bounded](): Unit = {
println(implicitly[Bounded[A]].minValue)
}
def main(args: Array[String]): Unit = {
printMinValue[Int]() // prints -2147483648
printMinValue[Long]() // prints -9223372036854775808
}
}
附录:
您甚至可以将其扩展为您的自定义类型,如下所示:
// A WeekDay ADT
sealed abstract trait WeekDay
case object Mon extends WeekDay
case object Tue extends WeekDay
case object Wed extends WeekDay
case object Thu extends WeekDay
case object Fri extends WeekDay
case object Sat extends WeekDay
case object Sun extends WeekDay
object WeekDay {
implicit val weekDayBounded = Bounded[WeekDay](Mon, Sun)
}
printMinValue[WeekDay]() // prints Mon
任意类型T
的最大值是多少?没有答案,因为没有最大值的DatabaseConnection
类。可以使用类型类告诉编译器某些类型的最大值是多少。这似乎最好用一个例子来解释。
abstract class Limit[T] {
val min: T
val max: T
}
implicit object IntLimits extends Limit[Int] {
val min = Int.MinValue
val max = Int.MaxValue
}
implicit object DoubleLimits extends Limit[Double] {
val min = Double.MinValue
val max = Double.MaxValue
}
你可以这样使用这个类型类:
def printMax[T: Limit] {
println(implicitly[Limit[T]].max)
}
printMax[Int] // prints 2147483647
printMax[Double] // prints 1.7976931348623157E308
类型类最酷的地方在于,你甚至可以在自定义的类上使用它们,例如,在库中充当索引的类:
// the class definition somewhere
case class Index(key: String)
// the definition of the limit values (potentially) somewhere else
implicit object IndexLimits extends Limit[Index] {
val min = Index("AA")
val max = Index("ZZ")
}
printMax[Index] // prints Index(ZZ)
是否有可能获得未知类型T的最小值或最大值?
不,它不是,原因很简单,如果T
是未知的,那么你怎么知道它甚至有的最小值或最大值?
您不能对任意类型这样做,因为只有少数类型(即具有Max- and - MinValue)。如果你不知道它是整型还是双精度还是其他数值你可以做的是模式匹配:
def maxValue[T <: AnyRef](t:T) = t match {
case x:Int => Int.MaxValue
case x:Double => Double.MaxValue
case x:Byte => Byte.MaxValue
case x:Short => Short.MaxValue
case x:Long => Long.MaxValue
case x:Float => Float.MaxValue
case x:Char => Char.MaxValue
case _ => -1
}
或者类似的