为什么这不能编译:
trait Item
trait StringItem extends Item {
def makeString: String
}
trait SomeOtherItem extends Item
trait DummyTrait
case class Marquee(items: Seq[Item]) extends {
val strings: Seq[String] = items.collect {
case si: StringItem => si.makeString // <-- partial function inside braces
}
} with DummyTrait
错误消息<$anon: Item => String> requires premature access to class Marquee
?在我看来,部分功能不使用Marquee
。然而,这编译:
val pf: PartialFunction[Item, String] = {
case si: StringItem => si.makeString
}
case class Marquee(items: Seq[Item]) extends {
val strings: Seq[String] = items.collect(pf)
} with DummyTrait
第一个版本,在Marquee
内部使用匿名部分函数,在val strings
不是早期定义时(即,如果我删除with DummyTrait
)会编译。我认为这是一个重要的线索,但我无法看到DummyTrait
如何干扰任何事情。明确将StringItem
范围限定为MyModule.StringItem
,以便DummyTrait
的后代无法重新定义它也不起作用。