Java - null instanceof Object 会同时评估为 true 和 false。

51

当我编译并运行这段代码时:

public class Testing {
    public static void main(String... args) {
        Object obj = null;
        if (obj instanceof Object) {
            System.out.println("returned true"); 
        } else {
            System.out.println("returned false"); 
        }
        System.out.println(" " + obj instanceof Object);
    }
}

我在命令行上看到了这个:

C:\Users\xxxxxx\Desktop>java Testing
returned false
true

"null instanceof someType" 总是应该返回false吗?


2
一个类似的谜题:什么时候 x + 0 != x?顺便说一下,你期望 + 有更高的优先级。 - Peter Lawrey
31
顺便说一下:当Java打印出true而不是空格符后,你可能会开始产生怀疑。 - Jonathan
5
我觉得标题有点误导,除非这是Java量子版本且instanceof返回一个量子布尔值。 - Mister Smith
1
@Peter - 当X为双精度/浮点NaN或任何字符串时。 - bestsss
6
你必须在使用Java,Schrödinger版本。 - frozenkoi
显示剩余3条评论
3个回答

102

这个:

" " + obj instanceof Object

被评估为:

(" " + obj ) instanceof Object

" " + obj 是一个非空字符串,它是 Object 的一个实例。


23
这是一个关于“当操作符优先级不明显时,多加括号比少加括号更好”的好教训。" " + (obj instanceof Object)将会打印出你期望的值。 - yshavit
2
不错的观点。这是你可以在 Joshua Block 和 Neal Gafter 的《Java Puzzlers》中学习到的那种违反直觉的行为。 - Alexandre Dupriez
1
我刚刚意识到并刷新了一下,看到了你的回答 :D - Infiniteh
2
如果你自己能理解这个,那就更好了 :) - MByD
3
@FabianBarney 确实如此,但是操作符优先级的问题不仅适用于这种情况(当然String.valueOf也是如此)。例如,您可能想要输出一个调试消息,"obj is a Foo? " + obj instanceof Foo。布尔逻辑是另一个很好的例子:a || b ? c: d是什么意思?是(a || b) ? c : d还是a || (b ? c : d)?括号(或更好的是命名变量!)可以使该代码更易读。 - yshavit
显示剩余5条评论

2
在最后的System.out.println语句中,先计算" " + obj,其结果是一个String类型,并检查该结果是否为Object的实例,然后打印输出该结果。

2

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