[英]Pattern matching refuses to recognize member type (value X is not a member of _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 _ =>
}
}
我想我应该提交一个错误?
这里肯定涉及类型擦除,但是我不确定100%确定您看到的是错误或预期的行为。 因为您将bar
val声明为Bar[S]
,所以S
被擦除,并且模式匹配器没有基础类型可以使用。 您可以通过将匹配项更改为以下内容来查看删除警告:
case fb:Bar[Foo] =>
奇怪的是,如果您将bar
声明为Any
类型,则原始匹配将起作用。 另外,如果将鼠标悬停在match语句中的fb
上,则可以看到它被视为:
Bar[S] with FooBar
同样,我相信所有这些都可以追溯到如何声明bar
。 不过,不确定这是否是一个错误,我想如果有人对模式匹配器的内部工作有更多的经验,可能会有更深入的解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.