密封型参数

时间:2014-05-29 04:37:36

标签: scala pattern-matching

我想知道是否可以使用Scala宏来生成与以下内容等效的内容:

sealed type Foo
type Bar <: Foo
type Baz <: Foo

然后,下列表达式将被识别为不详尽

(foo: Foo) match {
  case bar: Bar => ???
}

查看PatternMatching.scala中的注释,看起来可能有办法将这些约束传达给类型检查器。

1 个答案:

答案 0 :(得分:3)

type Bar <: Foo定义了一个抽象类型成员,给它具体定义type Bar = Foo是完全合法的,在这种情况下,匹配将是详尽的。编译器需要匹配的代码和给Bar具体定义的代码进行比较,以确定匹配是否是详尽的。因为这些可以在单独的类/特征中,彼此分开编译,所以这是不可能的。假设一个超类具有抽象定义并被编译,然后编译具有具体定义的子类,然后在超类中添加匹配语句并进行编译。在编译超类的新定义时,编译器不知道子类是否存在,因此它无法知道匹配是否是详尽的。