Given the definition of the class with the parameter bound type Animal[A <: String]
, it seems that the Scala compiler does not output B <: String
from Animal[B]
. Can we conclude? How to help the compiler to draw a conclusion?
The following is a concrete example with class examples where the lack of this output is a problem.
Consider the following case class hierarchy:
sealed trait Person[+T <: Person[T]] case class Student() extends Person[Student] case class Professor() extends Person[Professor]
I need to define a case University
class that I can create with a variable of type Person[_]
, for example val p: Person[_] = Student()
. I thought this would work with the following definition:
case class University(p: Person[_])
But this does not compile with an error:
type arguments [Any] do not conform to trait Person type parameter bounds [+T <: Person[T]]
If I bind a parameter of the case University
class type, it compiles (it also compiles with unlimited parameters if I drop the case
keyword, but this is not an option in my case):
case class BoundUniversity[P <: Person[P]](p: Person[P])
But this parameterized version cannot be created with an unlimited variable of type Person[_]
:
val p: Person[_] = Student() BoundUniversity(p)
not compiled with:
inferred type arguments [_$1] do not conform to method apply type parameter bounds [P <: Person[P]]
The same error occurs for a method with an associated argument, for example:
def general[P <: Person[P]](p: P) = println(p)
therefore, this does not apply to class constructors.
Two questions:
The type Person
defined using the restrictions of the parameters Person[+T <: Person[T]]
, therefore each instance of this type is insured to comply with these limits: val p: Person[P]
implies that P <: Person[P]
; or am I missing something? So, how can I explain this to the compiler so that it does not complain?
How / can I define a case class with members with an unrelated type parameter, for example case class University(p: Person[_])
?