Scala 中存在“无法解析符号”错误的通用方法

2023-12-28

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

check[Int](10, 1, 5) and 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错误为>=, && and <=。 可能出了什么问题?


当你写的时候

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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 中存在“无法解析符号”错误的通用方法 的相关文章

随机推荐