这个例子可以在groovy控制台中轻松测试。
var a被评估为非null,而b被评估为null。
两者都是org.codehaus.groovy.runtim.NullObject
的实例def b = null
println b.getClass()
println b == null
def a = null.getClass().newInstance()
println a.getClass()
println a == null
有谁知道为什么?
处理反射代码时,这是一个棘手的事情。
答案 0 :(得分:1)
其实我想知道这不是一个bug。作为解释... NullObject是运行时/中间类型的Object。如果对null执行任何操作,则使用NullObject。这个,以及NullObject#equals的实现说明= = null返回true。它返回失败,因为之前有一些内部代码,例如确定是否调用compareTo而不是equals等。现在这段代码以
开头if (left == right) return true;
if (left == null || right == null) return false;
所以null == null将返回true,但NullObject == null将返回false。另一方面,如果可能,NullObject不应泄漏。也许我们应该修复newInstance()来返回null。
答案 1 :(得分:0)
在NullObject的equals方法中,只有you are comparing it到true
才会返回null
由于NullObject
的实例并非严格null
,因此会返回false ...
NullObject
如果您针对另一个true
致电equals
,是否应该返回NullObject
,这可能是邮件列表中最好问的问题......我会看看并看看我是否能找到任何先前的问题。