6
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?当然o1o2两者都没有价值(ie 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
4

6 回答 6

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.
    }
}

编译器将类型a视为 an A,因此调用静态方法。但是引用的值是null无类型的。

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

顺便提一句

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

于 2012-09-27T08:55:04.413 回答
1

Java 中的“==”检查它是否是同一个实例,而不是简单地“它们相等吗?”。Java 中没有多个 null 实例的概念。如果将 null 与 null 进行比较,无论类型如何,您都将始终收到 true。

之所以不能将 null 作为参数传递给与另一个具有不同参数类型的方法同名的方法,是因为这两种方法都可能是在没有进一步类型上下文的情况下调用的候选方法。它不是猜测可能是哪一个,而是正确地指示错误。

于 2012-09-27T08:55:47.313 回答
1

请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.1

null属于“空类型”。“空类型”只有一个值 - null.

null 类型是每个引用类型的子类型。因此我们可以做

Integer i = null;   
(Integer)null

换句话说,null是每个引用类型中的有效值。

(将类型视为一组值;值的类型是它所属的集合;“子类型”表示“子集”。)

于 2012-09-27T16:20:08.480 回答
0

鉴于上面的例子,我们可以承认 null 没有类型:当你调用时m1(null),编译器无法确定实际参数的类型,也无法决定调用哪个方法。所有空值都相等且未键入,因此(null==null)==true.

于 2012-09-27T08:57:03.760 回答
0

Null 没有类型,但引用(对null或其他任何内容)具有类型。我们可以声明两个具有不同类型的引用变量,但null它们所引用的在两种情况下是相同的:

Integer a = null;
Double  b = null;

在你的例子中,

m1((Integer) null);

编译器使用它传递的引用类型来计算要调用哪个重载方法,而不是null值本身的类型。

于 2012-09-27T08:58:20.513 回答
0

在您的示例中,它证明编译器无法识别(null)类型并决定调用哪个方法。所以你必须明确给出类型。也null == null将永远是真的;无论你做什么演员,它都不会改变或给 null 一个类型。

这篇文章有很长的描述null

于 2012-09-27T09:02:35.880 回答