Дан кортеж с элементами типа A
и параметризованным другим типом в A
:
trait Writer[-A] { def write(a: A): Unit }
case class Write[A](value: A, writer: Writer[A])
И сайт использования:
trait Cache { def store[A](value: A, writer: Writer[A]): Unit }
Почему следующее работает должным образом, используя экстрактор кортежа:
def test1(set: Set[Write[_]], cache: Cache): Unit =
set.foreach {
case Write(value, writer) => cache.store(value, writer)
}
Но следующее не работает:
def test2(set: Set[Write[_]], cache: Cache ): Unit =
set.foreach { write =>
cache.store(write.value, write.writer)
}
с сообщением об ошибке
found : Writer[_$1] where type _$1
required: Writer[Any]
cache.store(write.value, write.writer)
^
Могу ли я исправить вторую форму (test2
) для правильной компиляции?
РЕДАКТИРОВАТЬ
Отходя от идей Оуэна, я попытался заставить его работать вообще без сопоставления с образцом (это то, что я хотел в первую очередь). Вот еще два странных случая, один рабочий, другой нет:
// does not work
def test3(set: Set[Write[_]], cache: Cache): Unit = {
def process[A](write: Write[A]): Unit =
cache.store(write.value, write.writer)
set.foreach(process)
}
// _does work_
def test4(set: Set[Write[_]], cache: Cache): Unit = {
def process[A](write: Write[A]): Unit =
cache.store(write.value, write.writer)
set.foreach(w => process(w))
}
Мне все еще малопонятно...