在Scala中,a.ne(null)和a != null有什么区别?

20

我一直都在使用

a != null

为了检查a不是空引用,但现在我遇到了另一种方法:

a.ne(null)

哪种方式更好,它们有何不同之处?


1
我不知道Scala,但通常情况下,在不确定对象是否为null的情况下调用该对象的方法是不好的。在许多语言中,这将引发“NullPointerException”。 - nuala
1
@yoshi:在Scala中,这并不是真的。实际上,null.eq(null)是完全有效的,并且返回truene代表!(this eq that))。 - Jack
与您的具体问题相关的另一种方式是:https://dev59.com/NFrUa4cB1Zd3GeqPhz_U - assylias
2个回答

16

正如 @Jack 所说的那样,x ne null 等同于 !(x eq null)。而 x != nullx ne null 之间的区别在于,!= 检查值相等性,而 ne 检查引用相等性。

例子:

scala> case class Foo(x: Int)
defined class Foo

scala> Foo(2) != Foo(2)
res0: Boolean = false

scala> Foo(2) ne Foo(2)
res1: Boolean = true

1
那么,实际上,与null进行比较时,没有区别,对吧? - Jean-Philippe Pellet
2
有一个区别。!= 可以被重载,而 ne 不能。此外,ne 只检查引用,而 != 可能会检查其他东西。 - drexin
1
但实际上对我来说仍然不清楚:我应该如何检查一个字符串参数是否为非空:使用!=还是ne? - Ivan
5
如果您要检查是否为null,我建议您始终使用ne,因为null始终是相同的引用,您只需要检查它即可。 - drexin

6
除了@drexin和@Jack所说的之外,neAnyRef中定义,并且仅适用于引用类型。
scala> "null".ne(null)
res1: Boolean = true

scala> 1.ne(null)
<console>:5: error: type mismatch;
 found   : Int
 required: ?{val ne: ?}
Note that implicit conversions are not applicable because they are ambiguous:
 both method int2Integer in object Predef of type (Int)java.lang.Integer
 and method intWrapper in object Predef of type (Int)scala.runtime.RichInt
 are possible conversion functions from Int to ?{val ne: ?}
       1.ne(null)

scala> 1 != null
res2: Boolean = true

“仅适用于引用类型”是指在Scala中存在值类型吗? - Ivan

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