Есть сообщение, которое освещает этот вопрос: Как я могу связать импликации в Scala? . По сути, вам необходимо иметь привязку вида для преобразования в LongArrayWritable
. Это означает, что неявный def
, который преобразуется в LongArrayWritable
, получает неявный аргумент (называемый ограниченным представлением), так что аргумент этого def
не является непосредственно Array
, а некоторым типом, который может быть преобразован в Array
:
object LongArrayWritable {
implicit def fromArraySource[A <% Array[Long]](a: A): LongArrayWritable = apply(a)
}
case class LongArrayWritable(a: Array[Long])
def test(a: LongArrayWritable): Unit = println("OK")
теперь это работает для массивов:
test(Array( 1L, 2L, 3L))
однако, поскольку Array
не является Iterable
и нет конверсий по умолчанию от Iterable
до Array
в области видимости, вам необходимо добавить одно:
implicit def iterable2Array[A: ClassManifest](i: Iterable[A]): Array[A] = i.toArray
тогда это работает:
test(List(1L, 2L, 3L))
Граница представления A <% Array[Long]
является ярлыком для неявного аргумента типа A => Array[Long]
, поэтому вы могли бы также написать
implicit def fromArraySource[A](a: A)(implicit view: A => Array[Long]) ...