Wie definiere ich Fallklassen mit Elementen mit ungebundenen Typparametern?

Gegeben eine Klassendefinition mit gebundenem TypparameterAnimal[A <: String] es scheint, dass der Scala-Compiler nicht schlussfolgertB <: String vonAnimal[B]. Ist der Rückschluss erlaubt? Wie kann man dem Compiler helfen, die Schlussfolgerung zu ziehen?

Im Folgenden finden Sie ein konkretes Beispiel für Fallklassen, bei denen das Fehlen dieser Schlussfolgerung ein Problem darstellt.

Betrachten Sie die folgende Fallklassenhierarchie:

<code>sealed trait Person[+T <: Person[T]]
case class Student() extends Person[Student]
case class Professor() extends Person[Professor]
</code>

Ich muss eine Fallklasse definierenUniversity was ich mit einer Variablen vom Typ instanziieren kannPerson[_], zum Beispielval p: Person[_] = Student(). Ich dachte, das würde mit der folgenden Definition funktionieren:

<code>case class University(p: Person[_])
</code>

Dies schlägt jedoch beim Kompilieren mit dem Fehler fehl:

<code>type arguments [Any] do not conform to trait Person's type parameter bounds [+T <: Person[T]]
</code>

Wenn ich den type-Parameter der case-Klasse bindeUniversity es kompiliert (es kompiliert auch mit unbegrenzten Parametern, wenn ich das fallen lassecase Stichwort, aber dies ist in meinem Fall keine Option):

<code>case class BoundUniversity[P <: Person[P]](p: Person[P])
</code>

Diese parametrisierte Version kann jedoch nicht mit einer unbegrenzten Variablen vom Typ instanziiert werdenPerson[_]:

<code>val p: Person[_] = Student()
BoundUniversity(p)
</code>

Kompilieren schlägt fehl mit:

<code>inferred type arguments [_$1] do not conform to method apply's type parameter bounds [P <: Person[P]]
</code>

Der gleiche Fehler tritt für eine Methode mit einem gebundenen Argument auf, wie:

<code>def general[P <: Person[P]](p: P) = println(p)
</code>

Das ist also nicht spezifisch für Klassenkonstruktoren.

Zwei Fragen:

Der TypPerson wird mit Parametergrenzen definiertPerson[+T <: Person[T]], so dass jede Instanz dieses Typs versichert ist, diese Grenzen einzuhalten:val p: Person[P] impliziert, dassP <: Person[P]; oder vermisse ich etwas Wie kann ich dem Compiler das klar machen, damit er sich nicht beschwert?

Wie / Kann ich eine Fallklasse mit Elementen mit ungebundenen Typparametern wie definieren?case class University(p: Person[_])?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage