2012-06-26 32 views
5

Tôi có đoạn code Scala sau:Scala loại hạn chế không cho phép null

class X[T1 <: AnyRef] { 
    var _x : T1 = null 
} 

Mã _x = null được đánh dấu như lỗi:

error: type mismatch; 
found : Null(null) 
required: T1 
var _x : T1 = null : T1 

Nếu tôi thêm loại Null công trình hạn chế tất cả mọi thứ khỏe. Tại sao điều này xảy ra? Scala định nghĩa AnyRef là tương đương với java.lang.Object, tất nhiên là nullable.

+2

này được thảo luận chi tiết [ở đây] (http: // www .scala-lang.org/node/2206). –

Trả lời

10

Thay vì

var _x : T1 = null 

sử dụng

var _x : T1 = _ 

Giải thích từ Scala Language Specification:

A variable definition var x: T = _ can appear only as a member of a template. It introduces a mutable field with type T and a default initial value. The default value depends on the type T as follows:

0 if T is Int or one of its subrange types,
0L if T is Long,
0.0f if T is Float,
0.0d if T is Double,
false if T is Boolean,
() if T is Unit,
null for all other types T.

+1

Rõ ràng là hoạt động. Và _x của một thể hiện của X sau đó là null. Bạn sẽ có thể giải thích những gì đang xảy ra ở đây trong một số chi tiết hơn? –

-1

Chỉ cần cho đầy đủ, sử dụng null trong Scala là một chút nản lòng. Bạn thường quấn biến của bạn trong một tùy chọn miễn là bạn không có một lý do chính đáng để sử dụng null. Xem Option để biết thêm chi tiết.

+0

Tôi hiểu nó, nhưng chúng ta phải tương thích với mã Java sử dụng rất nhiều null. –

6
class X[T1 <: AnyRef] { 
    var _x : T1 = null 
} 

Nếu bạn muốn nó được nullable, thay thế T1 <: AnyRef với T1 >: Null.

Why this happens?

Nothing là một subtype của AnyRef, và Nothing không nullable.

1

Nếu bạn muốn thực thi mà các tham số chung phải nullable, sau đó bạn có thể đặt thấp hơn ràng buộc với loại Null:

class X[T1 >: Null] { 
    var _x : T1 = null 
} 
Các vấn đề liên quan