给定一个元组,其元素的类型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
) 以正确编译吗?
编辑
与 Owen 的想法不同,我尝试了是否可以在完全没有模式匹配的情况下使其工作(这是我首先想要的)。这里还有两个奇怪的案例,一个有效,另一个无效:
// 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))
}
对我来说还是很模糊...