2

在以下情况下,Scala 似乎不承认 的类型system

sealed trait Bar[S] {
  def system: S
}

trait Foo { def bar(): Unit }

trait FooBar extends Bar[Foo]

如果我没有完全困惑,这意味着我应该能够执行以下操作:

def test(fb: FooBar) { fb.system.bar() }  // ok, this works

但以下失败:

trait Test[S] {
  val bar: Bar[S]

  bar match {
    case fb: FooBar => fb.system.bar() // error: value bar is not a member of _2
    case _ =>
  }
}

这是模式匹配器中的一个错误,还是我错过了一个关键点?


编辑:注意,以下工作:

trait Test[S] {
  val bar: Bar[S]

  bar match {
    case fb: FooBar => (fb: FooBar).system.bar()
    case _ =>
  }
}

我想我应该提交一个错误?

4

1 回答 1

0

这里肯定涉及类型擦除,但我不能 100% 确定您看到的是错误或预期行为。因为您将barval 声明为Bar[S],所以S会被删除,并且模式匹配器没有可使用的基础类型。您可以通过将匹配更改为:

case fb:Bar[Foo] =>

奇怪的是,如果您声明bar为类型,Any您的原始匹配将起作用。此外,如果您将鼠标悬停fb在匹配语句中,您可以看到它被视为:

Bar[S] with FooBar

同样,我相信这一切都可以追溯到如何bar宣布。虽然不确定这是一个错误,但我想在模式匹配器的内部工作方面有更多经验的人可能会有更深入的解释。

于 2013-05-11T11:49:45.693 回答