Scala类型约束不允许null

时间:2012-06-26 21:05:15

标签: scala types null

我有以下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的等价物,当然,它可以为空。

4 个答案:

答案 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

  

为什么会这样?

NothingAnyRef的子类型,Nothing不可为空。

答案 2 :(得分:1)

如果要强制泛型参数必须可为空,那么可以将下限设置为Null类型:

class X[T1 >: Null] {
   var _x : T1 = null
}

答案 3 :(得分:-1)

为了完整起见,在Scala中使用null有点气馁。您通常将变量包装在Option中,只要您没有充分的理由使用null。有关详细信息,请参阅Option