8

我有以下 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

4 回答 4

11

代替

var _x : T1 = null

采用

var _x : T1 = _

Scala语言规范的解释:

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

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

于 2012-06-26T21:12:22.267 回答
9
class X[T1 <: AnyRef] {
   var _x : T1 = null 
}

如果您希望它可以为空,请替换T1 <: AnyRefT1 >: Null.

为什么会发生这种情况?

Nothing是 的子类型AnyRef,并且Nothing不能为空。

于 2012-06-27T15:51:51.763 回答
2

如果你想强制泛型参数必须是可空的,那么你可以为 Null 类型设置一个下限:

class X[T1 >: Null] {
   var _x : T1 = null
}
于 2013-04-04T21:44:07.090 回答
-1

只是为了完整性,在 Scala 中使用 null 有点不鼓励。只要您没有充分的理由使用 null,您通常将变量包装在 Option 中。有关更多详细信息,请参阅选项

于 2012-06-26T21:34:13.880 回答