繁体   English   中英

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

[英]Comparison of two null objects from two different types

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 ),但它们不是同一类型( 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

所有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执行的唯一操作是分配或传递它而不检查它或将其与另一个引用进行比较。

BTW

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

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

之所以你不能将null作为参数传递给与具有不同参数类型的另一个方法具有相同名称的方法,是因为任何一种方法都可以成为没有其他类型上下文的候选方法。 它不是猜测可能是哪一个,而是正确地表示错误。

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

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

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

Integer i = null;   
(Integer)null

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

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

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

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

Integer a = null;
Double  b = null;

在你的例子中,

m1((Integer) null);

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

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

这篇文章null有很长的描述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM