¿Cómo definir clases de casos con miembros con parámetros de tipo no vinculados?

Dada una definición de clase con parámetro de tipo enlazadoAnimal[A <: String] Parece que el compilador de Scala no infiere.B <: String desdeAnimal[B]. ¿Se permite la inferencia? ¿Cómo ayudar al compilador a hacer la inferencia?

A continuación se muestra un ejemplo concreto con clases de casos donde la falta de esta inferencia es un problema.

Considere la siguiente jerarquía de clases de casos:

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

Necesito definir una clase de casoUniversity que puedo instanciar con una variable de tipoPerson[_], por ejemploval p: Person[_] = Student(). Pensé que esto funcionaría con la siguiente definición:

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

Pero esto falla compilando con el error:

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

Si enlace el parámetro de tipo de la clase de casoUniversity se compila (también se compila con parámetros ilimitados si descarto elcase palabra clave, pero esto no es una opción en mi caso):

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

Pero esta versión parametrizada no puede ser instanciada con una variable de tipo ilimitadaPerson[_]:

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

falla compilando con:

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

El mismo error ocurre para un método con un argumento enlazado como:

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

por lo que esto no es específico de los constructores de clase.

Dos preguntas:

El tipoPerson Se define con límites de parámetros.Person[+T <: Person[T]], para que cada instancia de este tipo esté asegurada para respetar esos límites:val p: Person[P] implica queP <: Person[P]; ¿O me estoy perdiendo algo? Entonces, ¿cómo puedo aclarar esto al compilador para que no se queje?

Cómo / Puedo definir una clase de caso con miembros con parámetro de tipo no vinculado comocase class University(p: Person[_])?

Respuestas a la pregunta(1)

Su respuesta a la pregunta