【发布时间】:2020-08-23 05:07:44
【问题描述】:
我有一系列继承的类,比基类有更多的方法。像这样:
class Animal
{
var Name: String
}
class Fish extends Animal
{
def swim()
{
println("I'm a Fish and i'm swimming!");
}
}
class Turtle extends Animal
{
def swim()
{
println("I'm a Turtle and i'm swimming!");
}
}
我想将类型匹配模式用于通用 Animal 类,以识别确切的类型并应用 swim() 方法(如果可以),如下所示:
myAnimal match {
case m:Fish => m.Swim()
case m:Turtle => m.Swim()
case _: => doSomethingElse()
}
我想用优雅的方式来写它,避免连续重复行。
我知道我可以做到:
myAnimal match {
case (_:Fish | _:Turtle) => println("I can do this!")
}
而且我知道,正如我在上面所写的,我可以做到:
myAnimal match {
case m:Fish => m.swim()
}
但是,我不能把它们放进去,或者像这样
myAnimal match {
case (m:Fish | m:Turtle) => m.swim() //ERROR (cannot recognize swim() method)
//Not even this
case m @ (_:Fish | _:Turtle) => m.swim() //ERROR (cannot recognize swim() method)
case _: => doSomethingElse()
}
一个好的解决方案是插入一个中间类,例如扩展Animals 的AnimalsThatCanSwim。这个解决方案应该是最后的选择,因为我必须避免更改扩展类。
【问题讨论】:
标签: scala types pattern-matching