【发布时间】:2020-09-02 18:29:33
【问题描述】:
为什么偏函数
val warpedEngineers: PartialFunction[Warped[Crewmember], Warped[Engineer]] = {
case v@Warped(Engineer(name: String)) => v.asInstanceOf[Warped[Engineer]]
}
似乎需要 asInstanceOf 在 RHS 上强制转换,而以下不需要
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
图案活页夹????@????由模式变量组成????和一个图案 ????。变量的类型???是静态类型???暗示的 图案 ????。此模式匹配任何值 ????与模式匹配 ??????,并将变量名绑定到该值。
一个模式????暗示一种类型????如果模式只匹配 类型??????。
【问题讨论】:
标签: scala casting pattern-matching instanceof parameterized-types