以下代码无法编译:
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
?
答案 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]) {
...
}