2014-04-16 15 views
5
val x: AnyRef = 42 

loại không phù hợp: tìm thấy Int(42) yêu cầu: AnyRefphương pháp kế thừa từ Object được trả lại mơ hồ

Lưu ý: một tiềm ẩn tồn tại từ scala.Int => java.lang.Integer, nhưng phương pháp kế thừa từ Object được trả lại mơ hồ. Điều này là để tránh một tiềm ẩn chăn mà sẽ chuyển đổi bất kỳ scala.Int đến bất kỳ AnyRef.

Bạn có thể muốn sử dụng một loại gán ghép: x: java.lang.Integer

Tôi không hiểu được một phần nhấn mạnh. Những phương pháp nào được đưa ra mơ hồ, và làm thế nào đến? Các phương thức được kế thừa từ Object luôn "không rõ ràng" trong Scala? Đây có phải là một kịch bản đặc biệt trong đó các phương pháp bằng cách nào đó gió lên nhiều lần trong một loại? Tôi chỉ không thấy sự mơ hồ xuất phát từ đâu.

Trả lời

2

Scala phải giả vờ rằng Int ở một vị trí khác trong phân cấp thừa kế so với Java. Điều này dẫn đến một số lúng túng.

Xem xét phương pháp notify. Chờ đợi trên Int không hoạt động - đó là nguyên thủy. Chờ một hộp mới java.lang.Integer không hoạt động, vì các chủ đề khác có thể đã kết thúc bằng các hộp riêng biệt được đóng gói riêng Integer s. Bạn chỉ không muốn notify hoạt động trên Int - đó là điều không đúng.

Nhưng nếu bạn có sự chuyển đổi Int => java.lang.Integer mà không cần bất cứ điều gì bất thường, bạn sẽ có thể gọi notify trên Int của bạn.

Để ngăn chặn loại hành vi thường sai này, cơ chế không giải quyết chuyển đổi do sự mơ hồ bị chiếm đoạt. Điều này giữ Int => java.lang.Integer phục vụ để chuyển đổi Int trong đó AnyRef được mong đợi (sẽ phá vỡ phân cấp thừa kế) và ngăn những thứ như 42.notifyAll hoạt động vì mặc dù java.lang.Integer có phương pháp đó.

Thư bạn thấy có nghĩa vụ bao gồm cả trường hợp 42.notify so với trường hợp 42: AnyRef.

+0

Bạn có thể mở rộng "cơ chế không giải quyết được chuyển đổi do sự mơ hồ bị chiếm đoạt" không? Đây chính là điều tôi không hiểu. – fredoverflow

Các vấn đề liên quan