在Scala中使用`无法解析符号'错误的通用方法

pro*_*eek 6 generics scala

我需要获得一个通用的检查方法,可以使用如下:

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)