2012-07-05 28 views
6

thể trùng lặp:
If an Int can't be null, what does null.asInstanceOf[Int] mean?Đúc null để Int và Double trong Scala

Tôi đã thử các sau đây trong REPL:

scala> null.asInstanceOf[Int] 
res12: Int = 0 

scala> null.asInstanceOf[Float] 
res13: Float = 0.0 

scala> null.asInstanceOf[Double] 
res14: Double = 0.0 

Nó mong chờ một ngoại lệ thời gian chạy (NPE hoặc ClassCastException) trong trường hợp đó.
Ai đó có thể giải thích lý do tại sao Scala phôi null bằng không?

Trả lời

5

Nó thực sự kỳ lạ, vì nó không phải là hành vi dự kiến ​​theo đặc điểm kỹ thuật:

asInstanceOf[T] trả về đối tượng null chính nó nếu T phù hợp với scala.AnyRef, và ném một NullPointerException khác.

- The Scala Language Specification, Version 2.9, tr. 75.

Và đó là known bug đã đóng nhưng liên quan đến this one, đang mở.

1

Tất cả các loại này đều mở rộng AnyVal, mà một giá trị không thể rỗng bằng cách gán, lý do tại sao nó biến chúng thành 0 để đáp ứng với asInstanceOf tuy nhiên thoát khỏi tôi. Nó dường như chỉ làm điều này trong REPL tuy nhiên đó là một trường hợp hơi đặc biệt. Trong mã thực nó trả về null.

+0

Tôi không thử nó trong "thực" mã bởi bản thân mình nhưng đây là hành vi đồng nghiệp của tôi nhận thấy trong mã "thực". – Michael

3

Lý do là null là loại tham chiếu - truyền luôn chuyển đổi sang loại tham chiếu khác - trong trường hợp này là phiên bản được đóng hộp là Int hoặc Double.

Trong bước tiếp theo, trình biên dịch chuyển đổi đối tượng được đóng hộp thành giá trị nguyên thủy. Nếu đối tượng được đóng hộp Intnull, giá trị nguyên thủy mặc định tương ứng của nó là 0.

Xem: If an Int can't be null, what does null.asInstanceOf[Int] mean?

+0

Cảm ơn. Nó có tuân thủ đặc tả ngôn ngữ không? – Michael

+0

không chắc chắn về phần chuyển đổi giữa các giá trị mặc định. – axel22

+0

Vâng, có vẻ như phần này mâu thuẫn với đặc điểm kỹ thuật (xem câu trả lời của Nicolas) – Michael

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