我在路径依赖类型和模式匹配方面遇到了问题:
当然,肯定有一种干净的方法可以避免强制转换吧?
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]])
当然,肯定有一种干净的方法可以避免强制转换吧?
trait Foo[F <: Foo[F]] { type Bar; def defaultBar: F#Bar }
的方式才能实现,但我真的想避免这种情况。 - 0__Baz
的一些代码?在上面的示例中,您从未将Baz
定义为Bar
的类型。您的测试是匹配Foo
,但您的代码从未使Baz
成为有效的Foo
。 - iainBaz
是Foo
的子类型。如果我匹配到foo
并发现它是Baz
的实例,显然b eq foo
。 - 0__