2012-06-17 19 views
5

Tôi đã tự hỏi tại sao AnyVal không thể được sử dụng trong kiểm tra isInstanceOf? Lý do đằng sau hành vi này là gì?Tại sao AnyVal không được sử dụng trong kiểm tra isInstanceOf?

scala> val c = 't' 
c: Char = t 

scala> c.isInstanceOf[AnyVal] 
<console>:12: error: type AnyVal cannot be used in a type pattern or isInstanceO 
f test 
      c.isInstanceOf[AnyVal] 
+0

Related: http://stackoverflow.com/questions/10416658 –

+0

Tôi đoán, điều này có liên quan quá http://www.scala-lang.org/node/3271 –

+0

bản sao có thể có của [Cách kiểm tra giá trị trên là AnyVal?] (http://stackoverflow.com/questions/10416658/how-to-test-a-value-on-being-anyval) –

Trả lời

11

AnyVal không còn tồn tại nữa khi chạy. Chỉ vào thời gian biên dịch. Nói cách khác, nó chỉ là một trình biên dịch "lừa" để xem xét các nguyên thủy JVM như các đối tượng hạng nhất.

Tuy nhiên, phương pháp isInstanceOf được thực thi khi chạy, do đó, nó không thể hoạt động. Do đó lỗi trình biên dịch.

+0

Tôi không chắc chắn nếu điều này là xấu xí hay tốt đẹp. –

+1

Vâng, 'isInstanceOf' được coi là xấu xí trong Scala ;-) Bạn nên dựa vào hệ thống kiểu để có được loại thông tin đó tại thời gian biên dịch. – paradigmatic

+0

Tôi có lẽ đang rất dày, nhưng tôi không hiểu được logic của câu trả lời này. Bạn không nói chung không cho phép các phương thức boolean chỉ vì câu trả lời luôn là "sai". Và '1.isInstanceOf [Int]' hoạt động tốt ... Và câu trả lời cho liên kết "trùng lặp" cho thấy rằng một phương pháp như vậy là có thể trong thời gian chạy. –

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