Studiuję kod źródłowy klas kolekcji Scala 2.8. Mam pytania dotyczące hierarchii scala.collection.Traversable
. Spójrz na następujących deklaracji:Parametry dziedziczenia i typu z Traversalable
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]
pytanie: Dlaczego Traversable
przedłużenia GenericTraversableTemplate
z parametrami typu [A, Traversable]
- dlaczego nie [A, Traversable[A]]
? Próbowałem niektóre eksperymenty z małego programu o tej samej strukturze i mam dziwny komunikat o błędzie, gdy próbowałem go zmienić na Traversable[A]
:
error: Traversable[A] takes no type parameters, expected: one
myślę, że korzystanie z @uncheckedVariance
adnotacji w GenericTraversableTemplate
ma też do czynienia z to? (To wydaje się być rodzajem potencjalnie niebezpiecznego hacka, zmuszającego rzeczy do działania ...).
edit - znaleziono kilka użytecznych odpowiedzi na temat adnotacji w this question (to dlatego GenericTraversableTemplate
służy zarówno do modyfikowalnych i niezmiennych zbiorów, które mają inny wariancji).
Pytanie: Kiedy patrzysz na hierarchii, widać, że Traversable
dziedziczy HasNewBuilder
dwukrotnie (raz przez TraversableLike
i raz przez GenericTraversableTemplate
), ale z nieco innych parametrów typu. Jak to działa dokładnie? Dlaczego różne parametry parametrów nie powodują błędu?
Dzięki za poświęcenie czasu, aby odpowiedzieć tak wyraźnie! Słyszałem wcześniej o "rodzajach", ale tak naprawdę nie rozumiałem, co oznaczają do tej pory. – Jesper