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&&valueAnyVal
不需要支持像=
这样的操作。这就是为什么它不能像您尝试的那样工作。不幸的是,没有所有可订购的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
}