“A>”的含义:Null`?

时间:2017-01-03 14:30:42

标签: scala

我尝试编写一个在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

3 个答案:

答案 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表示AB的超类型。 A >: Null此约束意味着ANull的超类型。 Null has两种超类型AnyAnyRef

在Scala中,您可以使用Option作为避免null使用的良好机制。

您如何看待这个?