2016-03-18 2 views
0

Почему это не работает?Различия типа Scala для неявного преобразования коллекции

implicit class ImplicitHelper[T <: IndexedSeq[String]](i: T) = { 
    def bar() = ??? 
} 

val foo: Array[String] = ??? 
foo.bar // no implicit conversion … 

не Array осуществить? IndexedSeq в иерархии унифицированной коллекции Scala?

Обновление: Как указали некоторые пользователи, пунктирная линия представляет собой не реализацию, а неявное преобразование. Таким образом, правильный способ заключается в использовании вида оценки вместо оценки типа на ответы ниже

enter image description here

+0

Немного запутанный вопрос. Возможно, это помогает: http://www.scala-lang.org/api/current/#scala.Array – Pavel

ответ

2

НЕРАСПРОСТРАНЕНИЕ смежной линия представляет собой вид, а не прямая иерархия:

final class Array[T](_length: Int) extends java.io.Serializable with java.lang.Cloneable 

Как вы можете видеть массив не распространяется IndexedSeq. Эти виды представляют implicit conversions

enter image description here

Так что единственное, что означает, что есть переход от IndexedSeq к Array.

+0

спасибо! это имеет большой смысл сейчас ... Ответ @ vitalii с использованием работ, связанных с просмотром, мощный материал! – echen

+0

Вы должны согласиться с его ответом, поскольку он действительно решает проблему. –

+0

yup принял моменты назад, так как он отвечает на вопрос «почему» мой пример не работал. поддержал другой ответ, так как он дал хорошую работу вокруг – echen

1

Посмотреть связанные работает для меня:

implicit class ImplicitHelper[T <% IndexedSeq[String]](i: T) { 
    def bar() = ??? 
} 
+0

Большое вам спасибо, больной ответьте на ответ. это также работает явно: неявный класс ImplicitHelper [T] (i: T) (неявный ev $ 1: T => IndexedSeq [String]) – echen