Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我可以将null作为参数传递给方法,而null不是接受参数的实例?_Java - Fatal编程技术网

Java 为什么我可以将null作为参数传递给方法,而null不是接受参数的实例?

Java 为什么我可以将null作为参数传递给方法,而null不是接受参数的实例?,java,Java,这个例子把我弄糊涂了。instanceTest方法只接受Comparable。null不是对象,不能是Comparable的实例。但是将null传递给instanceTest是编译的,甚至可以执行。为什么?更令人困惑的是,我可以创建一个指向null的可比较对象comp。instanceof与comp instanceof Comparable一起失败,但我无法将对象转换为另一种不可比较的类型。显然instanceof检查对象,但不检查引用?但是引用还包含一些关于它的类型的信息?那么,有没有办法检

这个例子把我弄糊涂了。
instanceTest
方法只接受Comparable。
null
不是对象,不能是Comparable的实例。但是将null传递给
instanceTest
是编译的,甚至可以执行。为什么?更令人困惑的是,我可以创建一个指向
null
的可比较对象
comp
instanceof
comp instanceof Comparable
一起失败,但我无法将对象转换为另一种不可比较的类型。显然instanceof检查对象,但不检查引用?但是引用还包含一些关于它的类型的信息?那么,有没有办法检查引用的类型

美国

空引用始终可以进行加宽引用转换 指向任何引用类型

其中定义为

存在从任何引用类型到的加宽引用转换 任何参考类型T,前提是S是T的子类型(§4.10)

因此,尽管
null
不是类型
Comparable
的实例(它根本不是实例,它是引用),但它可以用来代替类型
Comparable
(或任何其他引用类型)的引用

那么,有没有办法检查引用的类型


您已经在使用
==
instanceof

进行此操作。此答案很好地总结了null:
public static String instanceTest(Comparable cmp) {
    if (cmp == null) {
        return "null";
    }
    else return cmp.toString();
} 
public static void main(String[] args) {
    Comparable comp = null;
    //comp = new FileReader(""); cannot be converted
    System.out.println(null instanceof Comparable);
    System.out.println(comp instanceof Comparable);
    System.out.println(instanceTest(null));
}