我尝试编写一个在null
传递时无法编译的函数:
$scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_101).
Type in expressions for evaluation. Or try :help.
scala> :t null
Null
scala> def f[A >: Null](x: A):A = x
f: [A >: Null](x: A)A
然而,它没有按照我的预期发挥作用:
scala> f( null )
res1: Null = null
答案 0 :(得分:6)
正如已经指出的那样,A >: Null
允许A
本身Null
,但这在这里并不重要。即使A
需要是Null
的严格超类型,仍然可以将null
传递给f
,因为null
是有效值那些类型(直接来自Null
是它们的子类型的事实)。
如果您不想接受可以为空的类型,则A
必须是AnyVal
的子类型。请注意,这将阻止传递任何引用类型的值 - 而不仅仅是null
本身。
如果不接受null,则无法接受引用类型。
答案 1 :(得分:1)
Scala specification section 3.5.2 (conformance)州(强调我的):
<:
关系在类型之间形成预订,即它是 传递性和反身性。最小上界和最大下界 一组类型被理解为相对于该订单。
因此,如果我们从数学的角度来看类型构造函数声明,我们将:<
关系视为:
Null <: T <: Any
根据定义,关系是自反的,Null <: Null
在关系中,这使得null成为传递给方法的有效值。
正如@ sepp2k在评论和答案中正确地说的那样,A
不受上限约束的事实意味着Any
是一个有效的候选者,这意味着一个空值可以无论如何都要通过。
答案 2 :(得分:-1)
A :> B
表示A
是B
的超类型。
A >: Null
此约束意味着A
是Null
的超类型。
Null
has两种超类型Any
和AnyRef
。
在Scala中,您可以使用Option
作为避免null
使用的良好机制。
您如何看待这个?