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、元の一致が機能することです。また、fbmatch ステートメントにカーソルを合わせると、次のように処理されていることがわかります。

Bar[S] with FooBar

bar繰り返しますが、これはすべて、宣言の仕方にまでさかのぼると思います。ただし、これがバグであるかどうかはわかりません。パターン マッチャーの内部動作についてより経験のある人が、より詳細な説明を持っていると思います。

于 2013-05-11T11:49:45.693 に答える