Scala隐式从Array [T]转换为IndexedSeq [T]

时间:2014-11-02 20:29:08

标签: arrays scala implicit-conversion

以下代码无法编译:

  implicit class indexedSeqWithBinarySearch[T](xs: IndexedSeq[T]) {
    def binarySearch(a: T) = ???
  }

  Array(0, 1, 2).binarySearch(1)

方法binarySearch未添加到Array类。但我认为Array[T] -> WrappedArray[T] -> mutable.IndexedSeq[T] -> collection.IndexedSeq[T]有一个隐含的转换链?如何制作Array IndexedSeq

1 个答案:

答案 0 :(得分:1)

Array不是IndexedSeq的子类型,但是您的隐式类定义必然会出现这种情况。相反,您需要将可查看的任何类型视为 IndexedSeq[T]

我在这里使用myTail作为一个更现实的例子:

implicit class indexedSeqWithBinarySearch[T, LS <% IndexedSeq[T]](xs: LS) {
  def myTail = {
    val xs1 = xs: IndexedSeq[T] // now the cast works
    xs1.tail
  }
}

println(Array(1, 2, 3).myTail)

投射xs: IndexedSeq[T]的工作原理是因为签名中绑定了LS <% IndexedSeq[T]视图。

A <% B指定A必须可以B查看,因此需要在呼叫网站范围内从A转换为B ,此转换在方法体中有效。


更新:如果没有即将被弃用的视图边界,隐式类声明将如下所示:

implicit class indexedSeqWithBinarySearch[T, LS](xs: LS)(implicit ls2ixseq: LS => IndexedSeq[T]) {
  ...
}