Как гласит заголовок, я хочу иметь метод, который можно применять к любому типу аргумента, например Array[Array[_]]
или Seq[Array[_]]
или Array[Seq[_]]
или Seq[Seq[_]]
.Аргумент должен быть превращен в 2D-массив (Array[Array[_]]
), таким образом, изменяя только тип участвующих коллекций.
У меня есть следующая подпись, по-видимому, принимающая любую такую комбинацию, но я не могу построить массивы.
def apply[A: Manifest, S[_] <: Seq[_], U <% S[S[A]]](components: U): CombinationIterator[A] = {
new CombinationIterator(Array(components.map((s: S[A]) => s.toArray)))
}
Класс CombinationIterator
принимает в качестве аргумента Array[Array[T]]
.Я получаю следующую ошибку:
error: could not find implicit value for evidence parameter of type ClassManifest[A]
new CombinationIterator(Array(components.map((s: S[A]) => s.toArray)))
Для полноты, вот конструктор;возможно это имеет значение, потому что для A
.
. *1018*
class CombinationIterator[A: Manifest](components: Array[Array[A]]) extends Iterator[Array[A]]
требуется неудачный сеанс REPL
. Следующее работает для Array[Seq[_]]
, но не для Seq[Array[_]]
:
scala> def f[T:Manifest](s: Seq[Seq[T]]) = s.map(_.toArray).toArray
f: [T](s: Seq[Seq[T]])(implicit evidence$1: Manifest[T])Array[Array[T]]
scala> f(Array(Seq(1,2),Seq(3,4)))
res22: Array[Array[Int]] = Array(Array(1, 2), Array(3, 4))
scala> f(Seq(Array(1,2),Array(3,4)))
<console>:9: error: type mismatch;
found : Seq[Array[Int]]
required: Seq[Seq[?]]
f(Seq(Array(1,2),Array(3,4)))
^
(сбой) REPL для идеи Дидьера
scala> def f[T: Manifest, ST <% Seq[T]](s: Seq[ST]) = s.map(_.toArray).toArray
f: [T, ST](s: Seq[ST])(implicit evidence$1: Manifest[T], implicit evidence$2: (ST) => Seq[T])Array[Array[T]]
scala> f(Seq(Seq(1)))
<console>:9: error: No implicit view available from Seq[Int] => Seq[T].
f(Seq(Seq(1)))
^
Решение Я установил
Следующий код работает для моего проекта.Может быть, не все частные случаи покрыты.Это вариант второго ответа Рекса.
Я чувствую, что последствия хорошо заключены в объект-компаньон.
object CombinationIterator {
case class AArray[T](aa: Array[Array[T]])
implicit def seqseq2AA[T: Manifest](ss: Seq[Seq[T]]) = AArray(ss.map(_.toArray).toArray)
implicit def seqarray2AA[T: Manifest](sa: Seq[Array[T]]) = AArray(sa.toArray)
def apply[T: Manifest](components : AArray[T]): CombinationIterator[T] = {
new CombinationIterator(components.aa)
}
}
Редактировать
Чтобы опубликовать более новое пониманиео причинах вопроса.Я хотел иметь эти вложенные массивы из соображений производительности.Но массивы более важны для примитивных типов.Так что, вероятно, не так уж и плохо - с точки зрения производительности - иметь внешний массив в качестве «правильной» структуры данных, такой как Vector
.