我遇到路径依赖类型和模式匹配问题:
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]])
当然必须有一个干净的方法来避免演员阵容?
答案 0 :(得分:0)
不可能不使用投影并将类型限制为defaultBar
我们可以将其覆盖为不相关的数据类型
例如
trait MyFoo extends Foo {
override def defaultBar: Int
}