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)。我最初以为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发布于 2012-09-27 08:55:04
所有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和untyped。
在不引起NullPointerException的情况下,您可以使用NullPointerException执行的唯一操作是分配或传递它,而不检查它或将其与另一个引用进行比较。
顺便说一句
简而言之:编译器将根据引用的类型选择一个方法,在运行时,执行将基于引用对象的类。在运行时,null被视为任何类型或没有类型,如果您试图取消引用,则会得到一个NullPointerException。
发布于 2012-09-27 08:55:47
Java中的"==“检查它是否是同一个实例,而不是简单地”它们是否相等?“。Java中没有多个null实例的概念。如果将null与null进行比较,则无论类型如何,始终会收到true。
因此,不能将null作为参数传递给与具有不同参数类型的方法同名的方法,是因为这两种方法都可以在没有进一步类型上下文的情况下被调用。而不是猜测哪一个可能是,它正确地指出一个错误。
发布于 2012-09-27 16:20:08
请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.1
null属于"null类型“。"null类型“只有一个值-- null。
空类型是每个引用类型的子类型。所以我们可以
Integer i = null;
(Integer)null换句话说,null是每个引用类型中的一个有效值。
(将类型看作一组值;值的类型是它所属的集合;“子类型”表示“子集”。)
https://stackoverflow.com/questions/12617495
复制相似问题