在scaladoc中,BitSet被定义为扩展Set[Int].所以我认为BitSet在实例中使用as Set[Int]会工作,但我得到一个类型不匹配:
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_29).
scala> import collection.BitSet
import collection.BitSet
scala> val b: Set[Int] = BitSet()
<console>:8: error: type mismatch;
found : scala.collection.BitSet
required: Set[Int]
val b: Set[Int] = BitSet()
^
Run Code Online (Sandbox Code Playgroud)
然而演员工作:
scala> val b: Set[Int] = BitSet().asInstanceOf[Set[Int]]
b: Set[Int] = BitSet()
Run Code Online (Sandbox Code Playgroud)
那么为什么我需要明确地演绎BitSet一段Set[Int]时间Set[Int]才是超级型Set[Int]?
给定带有绑定类型参数的类定义,Animal[A <: String]似乎Scala编译器不会推断B <: String出Animal[B].是否允许推理?如何帮助编译器进行推理?
下面是一个案例类的具体示例,其中缺少此推断是一个问题.
考虑以下案例类层次结构:
sealed trait Person[+T <: Person[T]]
case class Student() extends Person[Student]
case class Professor() extends Person[Professor]
Run Code Online (Sandbox Code Playgroud)
我需要定义一个case类University,我可以用类型的变量实例化Person[_],例如val p: Person[_] = Student().我认为这可以使用以下定义:
case class University(p: Person[_])
Run Code Online (Sandbox Code Playgroud)
但这无法编译错误:
type arguments [Any] do not conform to trait Person's type parameter bounds [+T <: Person[T]]
Run Code Online (Sandbox Code Playgroud)
如果我绑定University它编译的case类的类型参数(如果我删除case关键字,它也会使用无界参数编译,但在我的情况下这不是一个选项):
case class BoundUniversity[P <: Person[P]](p: Person[P])
Run Code Online (Sandbox Code Playgroud)
但是这个参数化版本无法使用类型的无界变量进行实例化Person[_]:
val p: Person[_] = Student()
BoundUniversity(p)
Run Code Online (Sandbox Code Playgroud)
编译失败: …