繁体   English   中英

模式匹配拒绝识别成员类型(值X不是_2的成员)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM