Scala类型匹配中为何需要单独的case标识符?
问题解析:Scala类型匹配中标识符的作用
先看示例代码:
sealed trait Device case class Phone(model: String) extends Device: def screenOff = "Turning screen off" case class Computer(model: String) extends Device: def screenSaverOn = "Turning screen saver on..." def goIdle(device: Device): String = device match case p: Phone => p.screenOff case c: Computer => c.screenSaverOn
为什么需要p和c这类标识符?
核心原因是:父类型Device并没有定义screenOff或screenSaverOn方法。
如果直接写device.screenOff,编译器会直接报错——因为从Device的类型视角出发,它完全不知道子类有这些专属方法。而通过case p: Phone这种类型匹配,Scala编译器会自动把p的类型精确推断为Phone,此时调用p.screenOff就完全合法,因为Phone类确实定义了这个方法。同理,c会被推断为Computer类型,自然能调用screenSaverOn。
说白了,这些标识符是用来获取类型匹配后的精确子类型实例,让我们能访问子类特有的成员,而父类型本身并没有这些成员。
内容的提问来源于stack exchange,提问作者figs_and_nuts
相关产品推荐
相关产品推荐

