1
考虑:了解相关类型
scala> sealed trait Parent
defined trait Parent
scala> case object Boy extends Parent
defined object Boy
scala> case object Girl extends Parent
defined object Girl
scala> trait F {
| type A
| def x: A
| }
defined trait F
scala> case object FImpl extends F {
| override type A = Parent
| def x: Parent = Boy
| }
defined object FImpl
然后我定义的方法:
scala> def foobar(f: F)(matcher: f.A => Boolean): Boolean =
| matcher(f.x)
foobar: (f: F)(matcher: f.A => Boolean)Boolean
scala> foobar(FImpl)(_ match { case Boy => true; case Girl => false})
res3: Boolean = true
我很困惑,如何工作的。编译器在编译时必须知道f.A
的类型吗?
不确定你在问什么。你期望这不会编译? –
@ m-z - Owen很好地捕捉到了我不清楚的问题 - “当f是运行时值时,编译器如何看到成员f.A?' –