我有这段代码,它有效:
val directions = rs.map(_.direction) // Direction extends Enumeration
directions == directions.sorted.reverse
Run Code Online (Sandbox Code Playgroud)
我想改为做这样的事情:
ratings.map(_.direction).isInBackwardsOrder
class RichSeq[T](seq: Seq[T]) {
def isInBackwardsOrder = seq == seq.sorted.reverse
}
object RichSeq {
implicit def seq2richSeq[T](seq: Seq[T]) = new RichSeq[T](seq)
}
Run Code Online (Sandbox Code Playgroud)
我不断收到以下编译错误:
could not find implicit value for parameter ord: Ordering[T]
def isInBackwardsOrder = seq == seq.sorted.reverse
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它可以找到参数ord的隐含值,当它是原始形式时,但是一旦我将它拉入实用程序类就找不到它.
谢谢你的帮助,Alex
在原始形式中,您没有任何泛型.directions是Seq[SomeWellKnownType],在编译时,编译器查找Ordering[SomeWellKnownType]隐式作用域,并找到一个.
另一方面,在RichSeq[T]编译器中必须找到一个隐式Ordering[T]where T是一个类型参数.没办法那样做.您必须确保Ordering在创建时可用RichSeq:
class RichSeq[T](seq: Seq[T])(implicit ev: Ordering[T]) {...
Run Code Online (Sandbox Code Playgroud)
有一个快捷方式,特别是如果你只需要ev隐式范围而不明确地重新显示它,如下所示:
class RichSeq[T : Ordering](seq: Seq[T]) {...
Run Code Online (Sandbox Code Playgroud)
那么你在隐式方法中也有完全相同的问题,这也是通用的,使用相同的解决方案:
implicit def seq2richSeq[T: Ordering](seq: Seq[T]) = new RichSeq[T](seq)
Run Code Online (Sandbox Code Playgroud)
然后它应该工作.seq2richSeq当订单可用于Seq中元素的类型时,隐式转换将启动.
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |