我想知道是否可以使用Scala宏来生成与以下内容等效的内容:
sealed type Foo
type Bar <: Foo
type Baz <: Foo
然后,下列表达式将被识别为不详尽
(foo: Foo) match {
case bar: Bar => ???
}
查看PatternMatching.scala
中的注释,看起来可能有办法将这些约束传达给类型检查器。
答案 0 :(得分:3)
type Bar <: Foo
定义了一个抽象类型成员,给它具体定义type Bar = Foo
是完全合法的,在这种情况下,匹配将是详尽的。编译器需要匹配的代码和给Bar
具体定义的代码进行比较,以确定匹配是否是详尽的。因为这些可以在单独的类/特征中,彼此分开编译,所以这是不可能的。假设一个超类具有抽象定义并被编译,然后编译具有具体定义的子类,然后在超类中添加匹配语句并进行编译。在编译超类的新定义时,编译器不知道子类是否存在,因此它无法知道匹配是否是详尽的。