提问人:0__ 提问时间:9/23/2013 更新时间:1/4/2014 访问量:230
避免使用类型成员和子类型进行类型转换
Avoid type cast with type member and sub-typing
问:
我在路径相关类型和模式匹配方面遇到了问题:
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赞
Akhil
1/4/2014
#1
如果不使用投影并限制类型,就不可能做到这一点,因为我们可以将其覆盖为不相关的数据类型defaultBar
例如
trait MyFoo extends Foo {
override def defaultBar: Int
}
评论
trait Foo[F <: Foo[F]] { type Bar; def defaultBar: F#Bar }
Baz
Baz
Bar
Foo
Baz
Foo
Baz
Foo
foo
Baz
b eq foo