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 不foo认同b. 因此,它只适用于两种类型:

      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 回答