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 vs Float).我首先认为会打印错误.
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
解决方法
@H_403_11@ 所有空值都是无类型的并且是相等的.您可以将它传递给不同的引用类型,但它对于比较目的没有区别.它不是键入的空值,而是对可以键入的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执行的唯一操作是分配或传递它而不检查它或将其与另一个引用进行比较.
BTW
简而言之:编译器将根据引用的类型选择方法,在运行时,执行基于引用的对象的类.在运行时,null被视为任何类型或没有类型,如果您尝试取消引用它,则会得到NullPointerException.