java - 比较来自两种不同类型的两个空对象

标签 java types null comparison

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 都没有值(即 null),但它们不是来自同一类型(IntegerFloat)。我一开始以为 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/

相关文章:

javascript - 如何在javascript中计算字符串中包含的数字?

ios - Swift:在 AppDelegate 中设置标签文本

java - java逻辑中的三重嵌套for循环

java - 将图像文件添加到 JPanel 作为背景?

java - 如何在匿名类监听器中添加MouseEvent?

haskell - 编程语言中“缺少”(?)功能?

java - 安卓工作室 2.3 错误 : "Gradle sync failed: Cause: services.gradle.org"

类型中的 Postgresql 正则表达式而不是检查约束

ios - 如何在 Swift 中将核心数据属性设置为 nil?

android - 如果未调用 setcontentview(),为什么 findViewById() 返回 null?