我需要获得一个通用的检查方法,可以使用如下:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到了Cannot resolve symbol错误>=,&&并且<=.可能有什么问题?

Gab*_*lla 11
当你写作
def check[T <: AnyVal] ...
Run Code Online (Sandbox Code Playgroud)
你正在为所有的子类型定义方法AnyVal.但是,您的实现使用两种方法(<=和>=),这些方法仅适用于类型的子集,即支持排序的方法.
因此,您必须指定该方法适用于存在排序的所有类型,或者换句话说
def check[T](value: T, min: T, max: T)(implicit ev: T => Ordered[T]): Boolean =
value >= min && value <= max
Run Code Online (Sandbox Code Playgroud)
此语法相当于视图bound(<%)
def check[T <% Ordered[T]](value: T, min: T, max: T): Boolean = ...
Run Code Online (Sandbox Code Playgroud)
但是,由于不推荐使用视图边界,因此应该避免使用它.
另一种选择是以Ordering这种方式使用
def check[T](value: T, mini: T, maxi: T)(implicit ord: Ordering[T]): Boolean = {
import ord.mkOrderingOps
value >= mini && value <= maxi
}
Run Code Online (Sandbox Code Playgroud)
导入ord.mkOrderingOps使您能够使用常规>=和<=方法.
使用直接绑定的另一个等效替代方法:
def check[T: Ordering](value: T, mini: T, maxi: T): Boolean = {
val ord = implicitly[Ordering[T]]
import ord.mkOrderingOps
value >= mini && value <= maxi
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4571 次 |
| 最近记录: |