我需要一个通用的检查方法,可以使用如下:check[Int](10, 1, 5)
和 check[Double](10.0, 1.0, 5.0)
.
我试过这段代码:
trait RangeChecker {
def check[T <: AnyVal](value:T, mini:T, maxi:T) : Boolean = {
(value >= mini && value <= maxi)
}
}
但是,我得到
Cannot resolve symbol
>=
的错误, &&
和 <=
.可能有什么问题?
最佳答案
当你写
def check[T <: AnyVal] ...
您正在为 定义方法全部
AnyVal
的子类型.但是,您的实现使用了两种方法(
<=
和 >=
),它们仅适用于类型的子集,即支持排序的类型。所以你必须指定该方法适用于 全部 需要订购的类型 存在 ,或者换句话说
def check[T](value: T, min: T, max: T)(implicit ev: T => Ordered[T]): Boolean =
value >= min && value <= max
此语法等效于 View 绑定(bind) (
<%
)def check[T <% Ordered[T]](value: T, min: T, max: T): Boolean = ...
但是,因为 view bounds are deprecated ,你应该避免它。
另一种选择是使用
Ordering
以这种方式def check[T](value: T, mini: T, maxi: T)(implicit ord: Ordering[T]): Boolean = {
import ord.mkOrderingOps
value >= mini && value <= maxi
}
在哪里进口
ord.mkOrderingOps
使您能够使用常规 >=
和 <=
方法。另一个直接使用上下文绑定(bind)的等效替代方案:
def check[T: Ordering](value: T, mini: T, maxi: T): Boolean = {
val ord = implicitly[Ordering[T]]
import ord.mkOrderingOps
value >= mini && value <= maxi
}
关于scala - Scala 中出现 `cannot resolve symbol` 错误的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25248837/