给定一个类定义与结合的类型参数Animal[A <: String]
似乎Scala编译器不会推断B <: String
从Animal[B]
被推断允许吗? 如何帮助编译器进行推断?
下面是一个case类,其中缺乏这一推断的是一个问题,一个具体的例子。
请看下面的案例类层次结构:
sealed trait Person[+T <: Person[T]]
case class Student() extends Person[Student]
case class Professor() extends Person[Professor]
我需要定义的情况下类University
,我可以用类型的变量实例化Person[_]
例如val p: Person[_] = Student()
我认为这将有如下定义的工作:
case class University(p: Person[_])
但这种失败,出现错误编译:
type arguments [Any] do not conform to trait Person's type parameter bounds [+T <: Person[T]]
如果我绑定的情况下类的类型参数University
它编译(也有无限的参数编译如果我放弃的case
关键字,但这不是我的情况选择):
case class BoundUniversity[P <: Person[P]](p: Person[P])
但这个参数化的版本无法与类型的无限变量被实例化Person[_]
val p: Person[_] = Student()
BoundUniversity(p)
失败,编译:
inferred type arguments [_$1] do not conform to method apply's type parameter bounds [P <: Person[P]]
对于绑定参数等的方法发生了同样的错误:
def general[P <: Person[P]](p: P) = println(p)
所以这不是具体到类构造函数。
两个问题:
类型
Person
与参数界限定义Person[+T <: Person[T]]
从而使这种类型的每个实例是被保险人尊重这些界限:val p: Person[P]
意味着P <: Person[P]
; 还是我失去了一些东西? 那么,如何能明确这一点的编译器,它不抱怨吗?我如何/可以定义未绑定的类型参数的成员的情况下,像类
case class University(p: Person[_])