加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:54:40 所属栏目:Java 来源:网络整理
导读: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.那
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

解决方法

所有空值都是无类型的并且是相等的.您可以将它传递给不同的引用类型,但它对于比较目的没有区别.

它不是键入的空值,而是对可以键入的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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读