两种不同类型的两个空对象的比较

sp0*_*00m 6 java comparison null types

public void m1(Integer f) {
    ...
}

public void m1(Float f) {
    ...
}

public void main() {
    m1(null); // error: the method m1(Integer) is ambiguous for the type Main
    m1((Integer) null); // success
}
Run Code Online (Sandbox Code Playgroud)

鉴于上面的例子中,我们可以承认在某些方面null被打出来.那么为什么要打印以下行true?当然o1,o2两者都没有价值(即null),但它们不是同一类型(Integervs Float).我首先想到false会被打印出来.

Integer i = null;
Object o1 = (Object) i;
Float f = null;
Object o2 = (Object) f;
System.out.println(o1 == o2); // prints true

// in short:
System.out.println(((Object) ((Integer) null)) == ((Object) ((Float) null))); // prints true
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 8

所有null值都是无类型的并且是相等的.您可以将它传递给不同的引用类型,但它对于比较目的没有区别.

它不是null键入的值,而是对可以键入的null的引用.

一个常见的问题是这里发生了什么

class A {
    public static void hello() { System.out.println("Hello World"); }

    public static void main(String... args) {
        A a = null;
        a.hello();
        System.out.println("a is an A is " + (a instanceof A)); // prints false.
    }
}
Run Code Online (Sandbox Code Playgroud)

所述编译器看到的类型a作为A这样的静态方法被调用.但引用的值是null和无类型的.

您可以在null不导致NullPointerException的情况下执行的唯一操作是分配或传递它而不检查它或将其与另一个引用进行比较.

BTW

简而言之:编译器将根据引用的类型选择方法,在运行时,执行基于引用的对象的类.在运行时null被视为任何类型或没有类型,或者如果您尝试取消引用它,则会得到NullPointerException.