我正在尝试获取有序数字列表中的最小值和最大值。 使用特定类型时没有问题:
private def minMaxValue (valuesList: List[Option[Int]], min: Boolean): Option[Int] =
valuesList.flatten match {
case Nil => None
case xs => Some(if (min) xs.min else xs.max)
}
但是当我找不到将其更改为也接受 Long 和 Float 的方法时,我尝试了:
private def minMaxValue (valuesList: List[Option[Any]], min: Boolean): Option[Int] =
valuesList.flatten match {
case Nil => None
case xs: List[Int] => Some(if (min) xs.min else xs.max)
case xs: List[Long] => Some(if (min) xs.min else xs.max)
}
但它不起作用,我收到此警告
- non-variable type argument Int in type pattern List[Int] (the underlying of List[Int]) is unchecked since it is eliminated by erasure
在 scala 中解决这个问题的最佳方法是什么?
最佳答案
我会这样做:
def minMaxValue[T <% Ordered[T]](valuesList: List[Option[T]], min: Boolean): Option[T] =
valuesList.flatten match {
case Nil => None
case xs => Some(if (min) xs.min else xs.max)
}
这将创建一个带有类型参数T
的泛型函数。您必须声明 T
是有序类型,以便编译器可以证明 T
的集合具有 min
和 max
方法。
它适用于整数和 double :
scala> minMaxValue(List(Option(1), None, Option(3)), false)
res7: Option[Int] = Some(3)
scala> minMaxValue(List(Option(1.0), None, Option(3.0)), false)
res8: Option[Double] = Some(3.0)
scala> minMaxValue(List(Option(1.0), None, Option(3.0)), true)
res9: Option[Double] = Some(1.0)
JVM 中类型删除的问题是类型参数仅在编译时可用,而在运行时不可用。在我的解决方案中,编译器会看到类型 T
,并可以使用该信息进行类型检查并生成适用于您正在使用的 T
特定值的函数。在代码中,您需要在运行时判断某些内容是 List[Int]
还是 List[Long]
,但那时该信息已被删除。
关于scala - 获取 List[Option[Int 或 Long 或 Float]] 中的最小值和最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30194405/