未知类型的最小/最大值



是否有可能得到未知T型的MinValue -或MaxValue ?就像有Int.MinValueInt.MaxValueInt一样??

谢谢

正如@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
}

或者类似的

相关内容

最新更新