Cho một tuple với các yếu tố của loại A
và một loại parametrised trong A
:Strange loại không phù hợp khi sử dụng truy cập thành viên thay vì vắt
trait Writer[-A] { def write(a: A): Unit }
case class Write[A](value: A, writer: Writer[A])
Và một trang web sử dụng:
trait Cache { def store[A](value: A, writer: Writer[A]): Unit }
Tại sao sau khi làm việc như mong đợi, sử dụng bộ chiết của tuple:
def test1(set: Set[Write[_]], cache: Cache): Unit =
set.foreach {
case Write(value, writer) => cache.store(value, writer)
}
Nhưng thất bại sau:
def test2(set: Set[Write[_]], cache: Cache): Unit =
set.foreach { write =>
cache.store(write.value, write.writer)
}
với thông báo lỗi
found : Writer[_$1] where type _$1
required: Writer[Any]
cache.store(write.value, write.writer)
^
Tôi có thể sửa chữa các hình thức thứ hai (test2
) để biên dịch đúng cách?
EDIT
Khởi hành từ những ý tưởng của Owen Tôi cố gắng hiểu xem tôi có thể làm cho nó làm việc mà không phù hợp với mô hình ở tất cả (đó là những gì tôi muốn ở nơi đầu tiên). Dưới đây là hai trường hợp kỳ lạ, người ta làm việc, người kia không:
// 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))
}
vẫn còn khá mơ hồ với tôi ...
Cảm ơn bạn đã giải thích. Giải pháp đầu tiên của bạn không áp dụng được, bởi vì mỗi Write sẽ có một tham số kiểu khác nhau. Giải pháp thứ hai của bạn là khả thi. –
Tôi vẫn không thực sự hiểu những gì đang xảy ra. Xem chỉnh sửa của tôi cho câu hỏi. Đó là lý do tại sao tôi muốn giữ cho câu hỏi mở thêm một chút. –