密封型参数(Sealed type parameter)

2019-10-20 04:40发布

我想知道是否有可能使用Scala的宏来生成的东西等同于以下内容:

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

然后将下面的表达式将被识别为并非穷举

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

看着在评论PatternMatching.scala ,它看起来像有可能是这些约束传达给typechecker的方式。

Answer 1:

type Bar <: Foo定义抽象型部件,这将是完全合法为它给出具体定义type Bar = Foo ,在这种情况下,匹配将是详尽的。 编译器将需要的代码的比赛,并给予具体定义代码Bar进行比较,以决定是否匹配是详尽。 因为这些可能是在单独的类/性状,彼此单独编译,这是不可能的。 假设一个超类具有的抽象定义和编译,然后用具体定义一个子类进行编译,然后比赛语句在超加和编译。 编译器不知道在编译超类的新定义时,子类存在,所以无法知道这场比赛并不详尽的方式。



文章来源: Sealed type parameter