Scala中带有“无法解析符号”错误的泛型方法

Scala中带有“无法解析符号”错误的泛型方法,scala,generics,Scala,Generics,我需要得到一个通用的检查方法,该方法可以如下使用: 检查[Int](10,1,5)和检查[Double](10.0,1.0,5.0) 我尝试了以下代码: trait RangeChecker { def check[T <: AnyVal](value:T, mini:T, maxi:T) : Boolean = { (value >= mini && value <= maxi) } } trait RangeChecker{ def检查[T

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

检查[Int](10,1,5)
检查[Double](10.0,1.0,5.0)

我尝试了以下代码:

trait RangeChecker {
  def check[T <: AnyVal](value:T, mini:T, maxi:T) : Boolean = {
    (value >= mini && value <= maxi)
  }
}
trait RangeChecker{
def检查[T=mini&&value=
&
尝试以下操作:

def check[T <% Ordered[T]](value: T, mini: T, maxi: T): Boolean = {
    (value >= mini && value <= maxi)
  }

def check[T=mini&&value
AnyVal
不需要支持像
=
这样的操作。这就是为什么它不能像您尝试的那样工作。不幸的是,没有所有可订购的
AnyVal
的超类

您应改为使用:

调用时通常不需要显式定义类型
t
,或者:

scala> check(1, 2, 3)
res0: Boolean = false
scala> check(3, 2, 3.5)
res1: Boolean = true
当你写作时

def check[T <: AnyVal] ...

此语法相当于视图绑定(
=
=mini&&value)您能提供一个调用此方法的示例吗?当我尝试使用
Int
时,会出现“类型不匹配”错误。哦,是的……我得到了同样的结果。我在发布之前忘记尝试实现测试(我认为它会起作用,因为它编译了facepalm)。无论如何,你的答案有点优雅。看起来它可以与视图绑定一起工作(
我刚刚检查完并准备发表评论——我将编辑这篇文章。视图绑定不推荐使用,请参阅“数值”:任何东西都可以有顺序,比如元组
检查((1,2),(1,1),(2,3))
@samthebest,感谢您注意到
mkOrderingOps
,这比导入整个内容要好。不过,为什么要回滚我对这个问题的编辑?您的解决方案非常简洁、笼统,因此我希望让人们更容易通过谷歌搜索找到您的答案。您的答案是对上下文边界和视图边界的最好解释n所以-它值得SEO。你的编辑完全改变了问题的意义。OP甚至不知道上下文边界和视图边界。关于在scala中使用特征和上下文边界来实现类型类,有很多指南和问题,所以弹出这样的对话框并不是很关键。如果你愿意,你可以问一个问题我问了这么多,甚至自己给出了一个一般性的答案。说得好。我只是发现:
def check[T <: AnyVal] ...
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 = ...
def check[T](value: T, mini: T, maxi: T)(implicit ord: Ordering[T]): Boolean = {
  import ord.mkOrderingOps
  value >= mini && value <= maxi
}
def check[T: Ordering](value: T, mini: T, maxi: T): Boolean = {
  val ord = implicitly[Ordering[T]]
  import ord.mkOrderingOps
  value >= mini && value <= maxi
}