Seq("a","b","c","d")
на самом деле Seq.apply[X]("a","b","c","d")
, где X
подразумевается как A
с левой стороны. А в Seq.apply[A](...
ожидаются элементы типа A
, поэтому строки неявно преобразуются в A
s через toA
(так что на самом деле это val Seq(a, b, c, d): Seq[A] = Seq.apply[A](A("a"), A("b"), A("c"), A("d"))
).
Но "e" :: "f" :: Nil
на самом деле ::[Y]("e", ::[Z]("f", Nil))
, где, во-первых, Z
выводится как >: String
, а во-вторых, Y
выводится как >: String
, поэтому он имеет тип >: List[String]
(на самом деле List[Serializable]
) и он не соответствует типу шаблона Seq[A]
. Так что есть ошибка компиляции.
В сущности, у вас есть неявное преобразование из String
в A
, но не из Seq[String]
в Seq[A]
.
Если вы пишете просто val Seq(e,f) = "e" :: "f" :: Nil
, то это компилируется, так как правая часть соответствует шаблону в левой части.
Также val Seq(f): Seq[A] = "f" :: Nil
компилируется, поскольку в ::[Z]("f", Nil)
есть только один параметр типа, и его можно вывести равным A
.