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
}
鉴于上面的示例,我们可以以某些方式承认 null
是类型。那么为什么下面的行打印true
呢?当然 o1
和 o2
都没有值(即 null
),但它们不是来自同一类型(Integer
与 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
最佳答案
所有 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.
}
}
编译器 将a
的类型视为A
,因此调用静态方法。但引用的值是 null
且未类型化。
在不引起 NullPointerException 的情况下,您可以使用 null
执行的唯一操作是分配或传递它而不检查它或将它与另一个引用进行比较。
顺便说一句
简而言之:编译器会根据引用的类型选择方法,运行时根据引用对象的类来执行。在运行时 null
被视为任何类型或无类型,或者如果您尝试取消引用它,您将得到 NullPointerException。
关于java - 比较来自两种不同类型的两个空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12617495/