Scala类型约束不允许空值。

9

I have the following Scala code:

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的等价物,而java.lang.Object当然是可空的。

2
这在这里详细讨论了。 - Alex Wilson
4个回答

11

与其

var _x : T1 = null

使用

var _x : T1 = _

根据Scala语言规范的解释:

变量定义var x: T = _只能出现在模板的成员中。它引入了一个类型为T的可变字段和一个默认的初始值。默认值取决于类型T,如下所示:

如果T是Int或其子范围类型之一,则为0,
如果T是Long,则为0L,
如果T是Float,则为0.0f,
如果T是Double,则为0.0d,
如果T是Boolean,则为false,
如果T是Unit,则为(),
对于所有其他类型T,则为null。


1
显然这个可行。而X实例的_x然后为null。你能否详细解释一下这里发生了什么? - Alex Wilson

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

如果你想使它可为空,将T1 <: AnyRef替换为T1 >: Null

为什么会发生这种情况?

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


2
如果你想强制泛型参数必须可为空,那么你可以将下界设置为 Null 类型:
class X[T1 >: Null] {
   var _x : T1 = null
}

-1

仅为完整性考虑,在Scala中使用null有点不鼓励。通常情况下,只要没有充分的理由使用null,您就应该将变量包装在Option中。有关更多详细信息,请参见Option


我理解这一点,但我们必须与使用null的Java代码进行互操作。 - Konstantin Solomatov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接