scala - 访问类型的伴生对象

标签 scala companion-object

我有某种类型的变量,我想从伴随对象中获取信息。例如,我想我可以做这样的事情:

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/

相关文章:

scala - 如何从 CrossValidatorModel 中提取最佳参数

java - Scala - 如何在 Spark SQL 查询中将日期字符串转换为时间戳?

scala - 如何帮助 Scala 3 编译器推断路径相关类型?

scala - 为什么 Scala :_* to expand a Seq into variable-length argument list does not work in this case?

scala - 为什么我们必须从伴随对象显式导入具有隐式参数的隐式转换?奇怪的。

scala - 最终 val 会增加对象大小吗?

scala:私有(private)实用方法应该存在于伴随对象中吗?

regex - Scala & Play : route regex without identifier