Но с неявной функцией можно подумать, что scala
автоматически конвертировать каждый элемент в списке.
Почему?
Давайте попробуем что-нибудь:
class X[T : Manifest] {
override def toString = manifest[T].toString
}
val x = new X[Animal]
Как неявное преобразование Animal
в Elephant
поможет преобразовать X[Animal]
в X[Elephant]
? Нет даже экземпляра Animal
для конвертации! Но давайте поместим экземпляр там:
class X[T : Manifest](t: T) {
override def toString = manifest[T].toString + t.toString
}
Теперь у нас есть экземпляр, но, опять же, как Scala преобразует X[Animal]
в X[Elephant]
? Он даже не может добраться до t
, потому что это личное. Давайте сделаем это публично, тогда:
class X[T : Manifest](val t: T) {
override def toString = manifest[T].toString + t.toString
}
Там это публично. Но как это будет преобразовано? Одним из способов было бы это:
new X[Elephant](Animal toElephant x.t)
Но как Скала узнает, как это сделать? Кто сказал, что это правильный код или этого достаточно?
Можно написать неявное учение X
, как преобразовывать себя, если присутствует другое неявное преобразование, и такое неявное подобное может существовать для List
, но неявные преобразования опасны. Чем их меньше, тем лучше. И, следовательно, такого неявного не существует.