问题
Why does this fail to compile:
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
with the error message <$anon: Item => String> requires premature access to class Marquee
? It seems to me that the partial function makes no use of Marquee
. Yet this compiles:
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
The first version, with the anonymous partial function inside Marquee
, does compile when val strings
is not an early definition (that is, if I remove with DummyTrait
). I figure that's an important clue, but I haven't been able to see how DummyTrait
could interfere with anything. Explicitly scoping StringItem
as MyModule.StringItem
so a descendant of DummyTrait
can't redefine it doesn't work, either.
来源:https://stackoverflow.com/questions/27494290/anonymous-partial-function-in-early-initializer-requires-premature-access-to-cl