为什么有部分功能
val warpedEngineers: PartialFunction[Warped[Crewmember],Warped[Engineer]] = {
case v@Warped(Engineer(name: String)) => v.asInstanceOf[Warped[Engineer]]
}
似乎要求在RHS上投放asInstanceOf
,而以下内容则不需要
val engineers: PartialFunction[Crewmember,Engineer] = {
case v@Engineer(name) => v
}
sealed trait Crewmember
case class Engineer(name: String) extends Crewmember
case class Commander(name: String) extends Crewmember
case class Warped[+A <: Crewmember](v: A)
val engineers: PartialFunction[Crewmember,Engineer] = {
case v@Engineer(name) => v
}
val warpedEngineers: PartialFunction[Warped[Crewmember],Warped[Engineer]] = {
case v@Warped(Engineer(name: String)) => v.asInstanceOf[Warped[Engineer]]
}
val crew: List[Crewmember] =
List(Engineer("Geordi"),Commander("Picard"),Engineer("Scott"),Commander("Kirk"))
val warpedCrew: List[Warped[Crewmember]] =
List(Warped(Engineer("Geordi")),Warped(Commander("Picard")),Warped(Engineer("Scott")),Warped(Commander("Kirk")))
crew collect engineers
// res0: List[Engineer] = List(Engineer(Geordi),Engineer(Scott))
warpedCrew collect warpedEngineers
// res1: List[Warped[Engineer]] = List(Warped(Engineer(Geordi)),Warped(Engineer(Scott)))
像这样可以避免使用asInstanceOf
进行铸造
case Warped(eng: Engineer) => Warped(eng)
但是我想知道为什么编译器不插入隐式asInstanceOf
而是将v
键入Warped[Crewmember]
val warpedEngineers: PartialFunction[Warped[Crewmember],Warped[Engineer]] = {
case v@Warped(Engineer(name: String)) => v
}
Error: type mismatch;
found : Warped[Crewmember]
required: Warped[Engineer]
case v@Warped(Engineer(name: String)) => v
模式绑定器?@?由模式变量?和模式组成 ?。变量type的类型是由隐含的静态类型?。 模式?。该模式与该模式匹配的任何值?匹配 ?,它将变量名绑定到该值。
如果模式matches仅匹配的值,则模式?表示类型?。 ?类型。