Ich studiere den Quellcode der Scala 2.8 Sammlung Klassen. Ich habe Fragen zur Hierarchie von scala.collection.Traversable
. Schauen Sie sich die folgenden Erklärungen:Vererbung und Typ Parameter von 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]
Frage: Warum Traversable
erweitern GenericTraversableTemplate
mit Typ-Parameter [A, Traversable]
- warum nicht [A, Traversable[A]]
? Ich habe versucht, mit einem kleinen Programm mit der gleichen Struktur etwas experimentiert und bekam eine seltsame Fehlermeldung, wenn ich versuchte, es zu Traversable[A]
zu ändern:
error: Traversable[A] takes no type parameters, expected: one
ich, dass der Einsatz in GenericTraversableTemplate
der @uncheckedVariance
Anmerkung erraten auch zu tun hat mit Dies? (Das scheint eine Art potentiell unsicherer Hack zu sein, um Dinge zur Arbeit zu zwingen ...).
bearbeiten - fand einige nützliche Antworten über die Anmerkung in this question (beide es ist, weil GenericTraversableTemplate
für wandelbar und unveränderlich Sammlungen verwendet wird, die unterschiedliche Varianz).
Frage: Wenn Sie an der Hierarchie betrachten, sehen Sie, dass Traversable
inherits zweimal HasNewBuilder
(einmal über TraversableLike
und einmal über GenericTraversableTemplate
), aber mit etwas anderen Art Parametern. Wie funktioniert das genau? Warum verursachen die verschiedenen Typparameter keinen Fehler?
Danke, dass du dir die Zeit genommen hast, dies so klar zu beantworten! Ich hatte schon vorher von "Arten" gehört, aber bis jetzt nicht wirklich verstanden, was sie bedeuten. – Jesper