Неявное преобразование в Seq[T] из массива [T]

У меня возникли проблемы с просмотром границ. Я написал следующую функцию, которая должна принимать любой объект seq просматривается как Seq[T] и вернуться None если он пуст или Some(seq) иначе.

def noneIfEmpty[T, S <% Seq[T]](seq: S): Option[S] =
  if (seq.isEmpty) None else Some(seq)

Давайте определим функцию...

scala> def noneIfEmpty[T, S <% Seq[T]](seq: S): Option[S] = ...
noneIfEmpty: [T, S](seq: S)(implicit evidence$1: S => scala.collection.immutable.Seq[T])Option[S]

Хорошо, подпись функции выглядит правильно. Давайте попробуем пустой список...

scala> noneIfEmpty(List())
res54: Option[List[Nothing]] = None

Все идет нормально. Теперь давайте попробуем непустой список...

scala> noneIfEmpty(List(1,2,3))
res55: Option[List[Int]] = Some(List(1, 2, 3))

Отлично. Как насчет массива?

scala> noneIfEmpty(Array())
<console>:15: error: No implicit view available from Array[Nothing] => scala.collection.immutable.Seq[Any].
              noneIfEmpty(Array())
                         ^

Не так здорово Что тут происходит? Есть ли неявное преобразование из Array[T] в WrappedArray[T]? не должны scala.Predef.wrapRefArray позаботиться об этом?

1 ответ

Решение

Был ли у вас импорт scala.collection.immutable.Seq где-то?

Есть ряд неявных названий *ArrayOps определяется в scala.Predef которые конвертируют Array[T] в scala.collection.mutable.ArrayOps[T], но нет immutable.Seq,

scala> def noneIfEmpty[S <% collection.Seq[_]](seq: S): Option[S] =
     |   if(seq.isEmpty) None else Some(seq)
noneIfEmpty: [S](seq: S)(implicit evidence$1: S => Seq[_])Option[S]

scala> noneIfEmpty(Array[Int]())
res0: Option[Array[Int]] = None

scala> noneIfEmpty(Array[Int](1, 2, 3))
res1: Option[Array[Int]] = Some([I@7c92fffb)
Другие вопросы по тегам