在以下情况下,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 _ =>
}
}
我想我应该提交一个错误?
答案 0 :(得分:0)
类型擦除肯定涉及到这里,但我不是100%确定你所看到的是一个错误或预期的行为。因为您将bar
val声明为Bar[S]
,所以S
将被删除,并且模式匹配器没有要使用的基础类型。您可以通过将匹配更改为:
case fb:Bar[Foo] =>
奇怪的是,如果您将bar
声明为类型Any
,那么您的原始匹配就可以了。此外,如果您将鼠标悬停在匹配对帐单中的fb
上,则可以看到它被视为:
Bar[S] with FooBar
同样,我相信这一切都可以追溯到如何宣布bar
。不确定这是一个错误,我想有一个在模式匹配器的内部工作方面有更多经验的人可能会有更深入的解释。