Анонимная частичная функция в раннем инициализаторе требует преждевременного доступа к классу

Почему это не компилируется:

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 не мог переопределить его, также не работает.


person Ben Kovitz    schedule 15.12.2014    source источник
comment
Анонимные классы имеют доступ к окружающему их классу. Компилятор не знает, что ваша анонимная частичная функция на самом деле ни к чему не обращается (и было бы очень сложно проверить это в полной мере); он просто запрещает создавать любые анонимные классы, пока вы не перейдете к самому классу.   -  person lmm    schedule 16.12.2014
comment
@Imm Где (оскорбительный) анонимный класс? Сообщение об ошибке жалуется на анонимную функцию, а не на анонимный класс. Это компилирует: val pairs: Seq[(Item, Item)] = items.map { item => (item, item) }, поэтому я полагаю, что ограничение действительно не против анонимных функций.   -  person Ben Kovitz    schedule 16.12.2014
comment
Хм. Может быть, это PartialFunction? Если вы делаете val collector: PartialFunction[Item, String] = {case si: StringItem => si.makeString}, это запрещено?   -  person lmm    schedule 16.12.2014
comment
@Imm Только что попробовал. Эта строка завершается ошибкой с тем же сообщением об ошибке от компилятора.   -  person Ben Kovitz    schedule 16.12.2014
comment
Кто-то связал билет в stackoverflow. com/questions/30823381/, который дублирует это.   -  person som-snytt    schedule 14.06.2015