5

パス依存型とパターン マッチングに問題があります。

trait View[A]

trait Foo {
  type Bar

  def defaultBar: Bar
}
trait Baz extends Foo {
  def view(init: Bar): View[Bar]
}

trait Test {
  val foo: Foo

  def bar: foo.Bar = foo.defaultBar

  def test(): Option[View[foo.Bar]] =
    foo match {
      case b: Baz => Some(b.view(bar))
      case _ => None
    }
}

scalac が と識別されないため、これは失敗foobます。その結果、次の 2 つのキャストでのみ機能します。

      case b: Baz => Some(b.view(bar.asInstanceOf[b.Bar]).asInstanceOf[View[foo.Bar]])

確かに、キャストを回避するためのクリーンな方法が必要ですか?

4

1 に答える 1

0

defaultBar関係のないデータ型にオーバーライドできるため、プロジェクションを使用して型を制限せずに行うことはできません

例えば

trait MyFoo extends Foo { override def defaultBar: Int }

于 2014-01-04T04:34:24.300 に答える