scala - Scala 中出现 `cannot resolve symbol` 错误的通用方法

标签 scala generics

我需要一个通用的检查方法,可以使用如下:
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 >= 的错误, &&<= .
可能有什么问题?

enter image description here

最佳答案

当你写

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/

相关文章:

scala - 使用 sbt native 打包器进行基于环境变量的运行时配置

c# - 如何使用反射调用具有通用返回类型的方法

Java 泛型 : What is the compiler's issue here? ("no unique maximal instance")

c# - c# 中的类(使用 filehelpers)- 可空字符串在其他可空类型不存在时给出错误

generics - 如何在 Dart 强模式下声明泛型运算符?

dataframe - Spark 数据帧覆盖会创建重复项

scala - 当运行“.scala”程序时,Scala运行时/REPL背后到底发生了什么?

scala - 无法将 Spark SQL DataFrame 写入 S3

json - 如何在 Play 中将 java.time.LocalDate 转换为 JSValue?

java - 如何验证泛型类型扩展了 Java 中的另一个类/接口(interface)?