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

Java 比较两种不同类型的两个空对象,java,types,null,comparison,Java,Types,Null,Comparison,给出上述示例,我们可以在某些方面承认键入了null。那么,为什么以下几行打印true?当然o1和o2都没有值(即null),但它们不是来自同一类型(IntegervsFloat)。我起初以为false会被打印出来 public void m1(Integer f) { ... } public void m1(Float f) { ... } public void main() { m1(null); // error: the method m1(Integer)

给出上述示例,我们可以在某些方面承认键入了
null
。那么,为什么以下几行打印
true
?当然
o1
o2
都没有值(即
null
),但它们不是来自同一类型(
Integer
vs
Float
)。我起初以为
false
会被打印出来

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
值均为非类型且相等。您可以将其传递给不同的引用类型,但出于比较目的,这并没有什么区别

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

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

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
编译器将
a
的类型视为
a
,因此调用静态方法。但引用的值为
null
且未键入

使用
null
执行的唯一操作不会导致NullPointerException,即分配或传递它,而无需检查它或将它与另一个引用进行比较

顺便说一句

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

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


然后不能将null作为参数传递给一个与另一个具有不同参数类型的方法同名的方法的原因是,任何一个方法都可能是要调用的候选方法,而无需进一步的类型上下文。与猜测可能是哪一个不同,它正确地指示了一个错误。

鉴于上述示例,我们可以承认null不是类型化的:当调用
m1(null)
时,编译器无法确定实际参数的类型,也无法决定调用哪个方法。所有空值都是相等的且没有类型,因此
(null==null)==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.
    }
}
以你为例,

Integer a = null;
Double  b = null;

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

在您的示例中,它证明编译器无法识别(null)类型并决定要调用的方法。所以你必须明确地给出类型。而且
null==null
将始终为真;无论您执行什么类型转换,它都不会更改或为null指定类型。

这对
null
有很长的描述,请参见

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

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

m1((Integer) null);
换句话说,
null
是每个引用类型中的有效值


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

Null没有类型:[[1]:
Null
已键入;请参阅我的答案。
Integer i = null;   
(Integer)null