我有以下Scala代码:
class X[T1 <: AnyRef] {
var _x : T1 = null
}
代码_x = null突出显示为错误:
error: type mismatch;
found : Null(null)
required: T1
var _x : T1 = null : T1
如果我添加Null类型约束,一切正常。为什么会这样? Scala将AnyRef定义为java.lang.Object的等价物,当然,它可以为空。
答案 0 :(得分:10)
而不是
var _x : T1 = null
使用
var _x : T1 = _
Scala语言规范的解释:
变量定义var x:T = _只能作为模板的成员出现。它引入了一个带有类型T和默认初始值的可变字段。默认值取决于类型T,如下所示:
如果T是Int或其子范围类型之一,则0,
如果T为长,则为0L,
0.0f如果T是Float,
如果T为Double,则为0.0d,
如果T是布尔值,则为假,
()如果T是单位,
对于所有其他类型T.为null。
答案 1 :(得分:6)
class X[T1 <: AnyRef] {
var _x : T1 = null
}
如果您希望它可以为空,请将T1 <: AnyRef
替换为T1 >: Null
。
为什么会这样?
Nothing
是AnyRef
的子类型,Nothing
不可为空。
答案 2 :(得分:1)
如果要强制泛型参数必须可为空,那么可以将下限设置为Null类型:
class X[T1 >: Null] {
var _x : T1 = null
}
答案 3 :(得分:-1)
为了完整起见,在Scala中使用null有点气馁。您通常将变量包装在Option中,只要您没有充分的理由使用null。有关详细信息,请参阅Option。