如何定义与未绑定类型参数成员case类?(How to define case classes wi

2019-06-23 09:44发布

给定一个类定义与结合的类型参数Animal[A <: String]似乎Scala编译器不会推断B <: StringAnimal[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)

所以这不是具体到类构造函数。

两个问题:

  1. 类型Person与参数界限定义Person[+T <: Person[T]]从而使这种类型的每个实例是被保险人尊重这些界限: val p: Person[P]意味着P <: Person[P] ; 还是我失去了一些东西? 那么,如何能明确这一点的编译器,它不抱怨吗?

  2. 我如何/可以定义未绑定的类型参数的成员的情况下,像类case class University(p: Person[_])

Answer 1:

A型X[_]几乎不是你想要的。 当您使用_一个类型,你基本上是说你不在乎这个参数是什么,因为你永远需要使用它。

无论如何,这编译。 它很可能咬你在路上,存在的类型是棘手的东西,他们是的,但...

case class University(p: Person[t] forSome { type t <: Person[t] })


文章来源: How to define case classes with members with unbound type parameters?