如何比较泛型枚举值?
How to compare generic enumeration values?
我正在尝试为 Scala Enumeration
值编写一个通用的 max 方法。我有
def enumMax[E <: Enumeration, V <: E#Value](v1: V, v2: V): V = v1.compare(v2) match {
case x if x > 0 => v1
case x if x < 0 => v2
case _ => v1
}
但我收到了相当神秘的错误消息
[error] overloaded method value compare with alternatives:
[error] ((that: _1.Value)Int) forSome { val _1: E } <and>
[error] (that: _1.Value)Int
[error] cannot be applied to (V)
[error] def enumMax[E <: Enumeration, V <: E#Value](v1: V, v2: V): V = v1.compare(v2) match {
[error] ^
有人知道这里发生了什么吗?有没有更好的方法来完成这个?谢谢
相关问题:
添加上下文绑定就足够了Ordering
def enumMax[E <: Enumeration, V <: E#Value : Ordering](v1: V, v2: V): V = v1.compare(v2) match {
case x if x > 0 => v1
case x if x < 0 => v2
case _ => v1
}
只是编译器报错,不清楚。
尝试
def enumMax(e: Enumeration)(v1: e.Value, v2: e.Value): e.Value = v1.compare(v2) match {
case x if x > 0 => v1
case x if x < 0 => v2
case _ => v1
}
您可以像这样编写通用 max
:
def max[T](a: T, b: T)(implicit ord: Ordering[T]) =
if (ord.compare(a, b) >= 0) { a } else { b }
如果您愿意,可以限制支持的类型,但尚不清楚这是否特别有用。
def maxEnum[T <: Enumeration#Value](a: T, b: T)(implicit ord: Ordering[T]) =
if (ord.compare(a, b) >= 0) { a } else { b }
我正在尝试为 Scala Enumeration
值编写一个通用的 max 方法。我有
def enumMax[E <: Enumeration, V <: E#Value](v1: V, v2: V): V = v1.compare(v2) match {
case x if x > 0 => v1
case x if x < 0 => v2
case _ => v1
}
但我收到了相当神秘的错误消息
[error] overloaded method value compare with alternatives:
[error] ((that: _1.Value)Int) forSome { val _1: E } <and>
[error] (that: _1.Value)Int
[error] cannot be applied to (V)
[error] def enumMax[E <: Enumeration, V <: E#Value](v1: V, v2: V): V = v1.compare(v2) match {
[error] ^
有人知道这里发生了什么吗?有没有更好的方法来完成这个?谢谢
相关问题:
添加上下文绑定就足够了Ordering
def enumMax[E <: Enumeration, V <: E#Value : Ordering](v1: V, v2: V): V = v1.compare(v2) match {
case x if x > 0 => v1
case x if x < 0 => v2
case _ => v1
}
只是编译器报错,不清楚。
尝试
def enumMax(e: Enumeration)(v1: e.Value, v2: e.Value): e.Value = v1.compare(v2) match {
case x if x > 0 => v1
case x if x < 0 => v2
case _ => v1
}
您可以像这样编写通用 max
:
def max[T](a: T, b: T)(implicit ord: Ordering[T]) =
if (ord.compare(a, b) >= 0) { a } else { b }
如果您愿意,可以限制支持的类型,但尚不清楚这是否特别有用。
def maxEnum[T <: Enumeration#Value](a: T, b: T)(implicit ord: Ordering[T]) =
if (ord.compare(a, b) >= 0) { a } else { b }