我正在尝试在有序数字列表中获取最小值和最大值。 使用特定类型时没有问题:
v2
但是当我找不到改变它的方式也接受Long和Float时,我试过了:
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)
}
但它不起作用,我收到
的警告
- 类型模式中的非变量类型参数Int List [Int](List [Int]的基础)未被选中,因为它被消除了 擦除
在scala中解决此问题的最佳方法是什么?
答案 0 :(得分:2)
我会这样做:
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
方法。
它适用于整数和双打:
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]
,但那时该信息已被删除。
答案 1 :(得分:0)
我会将List[Option[Int]]
转换为List[Int]
,以便能够使用max
和min
方法。
val listOpt = List(Some(3), None, Some(7))
val listValues = listOpt.collect{
case Some(x) => x
}
listValues.max
listValues.min