当你写的时候
def check[T <: AnyVal] ...
你正在定义方法all的亚型AnyVal
。
但是,您的实现使用两种方法(<=
and >=
)仅适用于类型的子集,即支持排序的类型。
所以你必须指定该方法适用于all订购的类型exists,或者换句话说
def check[T](value: T, min: T, max: T)(implicit ev: T => Ordered[T]): Boolean =
value >= min && value <= max
此语法相当于视图绑定 (<%
)
def check[T <% Ordered[T]](value: T, min: T, max: T): Boolean = ...
但是由于视图边界已弃用 https://github.com/scala/scala/pull/2909,你应该避免它。
另一种选择是使用Ordering
以这种方式
def check[T](value: T, mini: T, maxi: T)(implicit ord: Ordering[T]): Boolean = {
import ord.mkOrderingOps
value >= mini && value <= maxi
}
哪里进口ord.mkOrderingOps
让您能够使用常规的>=
and <=
方法。
另一种直接使用上下文绑定的等效替代方案:
def check[T: Ordering](value: T, mini: T, maxi: T): Boolean = {
val ord = implicitly[Ordering[T]]
import ord.mkOrderingOps
value >= mini && value <= maxi
}