Tôi đang triển khai cấu trúc dữ liệu. Mặc dù nó không kết hợp trực tiếp với bất kỳ đặc điểm thu thập tiêu chuẩn nào của Scala, nhưng tôi muốn đưa vào phương thức to[Col[_]]
, với một nhà máy xây dựng, có thể tạo ra các bộ sưu tập Scala tiêu chuẩn.Thêm phương thức `vào [Col [_]]` cho tập hợp biến đổi
Bây giờ giả sử này, sao chép từ GenTraversableOnce
:
trait Foo[+A] {
def to[Col[_]](implicit cbf: CanBuildFrom[Nothing, A, Col[A]]): Col[A]
}
này không thành công với error: covariant type A occurs in invariant position
.
Vậy làm thế nào để GenTraversableOnce
đạt được điều này? Tôi có thể thấy trong mã nguồn, rằng họ thêm một số annotation.unchecked.uncheckedVariance
...
Điều đó giống như một mẹo bẩn. Nếu typer từ chối điều này bình thường, làm thế nào điều này có thể được an toàn và tắt với uncheckedVariance
?
Bạn don 't thực sự cần' A' và 'A1' liên quan ở tất cả. Điều này cũng hoạt động: 'def to [B, Col [_]] (ngầm định cbf: CanBuildFrom [Nothing, A, Col [B]]): Col [B]'. Ngay cả điều này có vẻ hạn chế không cần thiết ở chỗ nó chỉ cho phép kết quả của hình dạng 'Col [B]'. Điều này có vẻ chung chung và đơn giản hơn: 'def to [R] (ngầm định cbf: CanBuildFrom [Nothing, A, R]): R'. – Rotsor