Loại bỏ hiệp phương sai hoàn toàn dĩ nhiên sẽ không được phép và không được phép. Cho m: Map[A, String]
và v : Any
, bạn có thể làm val mm : Map[A, Any] = m + v
. Đây là định nghĩa của Map
và tất cả những người triển khai phải tuân theo. Lớp của bạn có thể là bất biến, nhưng nó phải thực hiện giao diện biến đổi đầy đủ của Bản đồ.
Bây giờ xác định lại +
để ném lỗi là một câu chuyện khác (chưa được phát âm). Vấn đề với phương pháp +
mới của bạn là sau khi generics xóa, nó có cùng chữ ký so với phương thức +
khác. Có một thủ thuật: thêm vào tham số ngầm, để bạn có hai tham số trong chữ ký, điều này làm cho nó khác với thông số đầu tiên.
def +(kv : (A,B))(implicit useless: A <:< A) : MyMap[A,B]
(nó không thực sự có vấn đề gì tiềm ẩn tham số bạn đang tìm kiếm, chừng nào một được tìm thấy implicit useless: Ordering[String]
. Hoạt động giống cũng)
Làm như vậy, bạn có vấn đề thông thường với quá tải . Nếu bạn thêm một B mà không có trình biên dịch biết nó là như vậy, phương thức thất bại sẽ được gọi. Nó có thể là tốt hơn để thực hiện một loại kiểm tra có để B trường hợp được chấp nhận bất cứ điều gì. Điều đó sẽ yêu cầu nhận được một bản kê khai [Manifest [B] trong bản đồ của bạn.
Nguồn
2011-08-17 23:15:28
Có thể bạn có thể sử dụng bản đồ thành viên thay vì phát sinh? – Owen
Ngoài ra, tại sao nó cần phải là bất biến? Tôi nghĩ (tôi không biết nhiều Scala mặc dù) thời gian duy nhất bạn cần bất biến là nếu nó có thể là cả nguồn và bồn rửa, nhưng bản đồ là bất biến nên nó không thể là bồn rửa được. – Owen
Tôi muốn thực hiện một bản đồ hai hướng. Không phải là một vấn đề lớn nếu tôi triển khai Bản đồ và chỉ ủy nhiệm cho hai Maps nội bộ xác định ánh xạ tiến và lùi, nhưng tôi cần sự bất biến trong trường hợp đó. –