我有一些代码,它有效:
val directions = rs.map(_.direction) // Direction extends Enumeration
directions == directions.sorted.reverse
我想改为做这样的事情:
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)
}
我一直收到以下编译错误:
could not find implicit value for parameter ord: Ordering[T]
def isInBackwardsOrder = seq == seq.sorted.reverse
我不明白为什么它可以找到参数ord的隐含值,当它是原始形式时,但是一旦我将它拉入实用程序类就找不到它。
感谢您的帮助, 亚历
答案 0 :(得分:6)
在原始形式中,您没有任何泛型。 directions
是Seq[SomeWellKnownType]
,在编译时,编译器在隐式作用域中查找Ordering[SomeWellKnownType]
,并找到一个。{/ p>
另一方面,在RichSeq[T]
中,编译器必须找到隐式Ordering[T]
,其中T
是一个类型参数。没办法那样做。您必须确保在创建Ordering
:
RichSeq
可用
class RichSeq[T](seq: Seq[T])(implicit ev: Ordering[T]) {...
有一个快捷方式,特别是如果你只需要隐式范围内的ev
而不明确地重新显示它,就像在这里:
class RichSeq[T : Ordering](seq: Seq[T]) {...
然后你在隐式方法中遇到完全相同的问题,这也是通用的,使用相同的解决方案:
implicit def seq2richSeq[T: Ordering](seq: Seq[T]) = new RichSeq[T](seq)
然后它应该工作。当序列可用于Seq中元素的类型时,seq2richSeq
隐式转换将启动。