Я изучаю исходный код классов коллекции Scala 2.8. У меня есть вопросы об иерархии scala.collection.Traversable
. Посмотрите на следующие заявления:Наследование и параметры типа Traversable
package scala.collection
trait Traversable[+A]
extends TraversableLike[A, Traversable[A]]
with GenericTraversableTemplate[A, Traversable]
trait TraversableLike[+A, +Repr]
extends HasNewBuilder[A, Repr]
with TraversableOnce[A]
package scala.collection.generic
trait HasNewBuilder[+A, +Repr]
trait GenericTraversableTemplate[+A, +CC[X] <: Traversable[X]]
extends HasNewBuilder[A, CC[A] @uncheckedVariance]
Вопрос: Почему Traversable
продлить GenericTraversableTemplate
с параметрами типа [A, Traversable]
- почему не [A, Traversable[A]]
? Я попробовал некоторые эксперименты с небольшой программой с той же структурой и получил сообщение странных ошибок, когда я попытался изменить его Traversable[A]
:
error: Traversable[A] takes no type parameters, expected: one
Я предполагаю, что использование @uncheckedVariance
аннотацию в GenericTraversableTemplate
также имеет отношение к это? (Это кажется своего рода потенциально опасным взломом, чтобы заставить работать ...).
редактировать - нашел некоторые полезные ответы о аннотации в this question (это потому, что GenericTraversableTemplate
используется как для изменяемых и неизменяемых коллекций, имеющих различную дисперсия).
Вопрос: Когда вы смотрите на иерархии, вы видите, что Traversable
наследуется HasNewBuilder
дважды (один раз через TraversableLike
и один раз через GenericTraversableTemplate
), но с несколько другими параметрами типа. Как это работает? Почему разные параметры типа не вызывают ошибку?
Спасибо, что нашли время, чтобы ответить на это так ясно! Раньше я слышал о «видах», но на самом деле не понимал, что они означают до сих пор. – Jesper