Java null对应于Double

Ang*_*own 3 java

我不知道如何提出这个问题或使用什么标题.我希望我不违反任何规则.无论如何,有人可以向我解释以下行为吗?我有这个代码:

X x = new X();
x.dosmth(null);

static class X{
        void dosmth(Object obj) { System.out.println("X:Object"); }
        void dosmth(Double obj) { System.out.println("X:Double"); }
        void dosmth(int obj) { System.out.println("X:int"); }
        void dosmth(double obj) { System.out.println("X:double"); }
        void dosmth(char obj) { System.out.println("X:char"); }
        void dosmth(byte obj) { System.out.println("X:byte"); }
}
Run Code Online (Sandbox Code Playgroud)

我得到的是这个:

X:Double
Run Code Online (Sandbox Code Playgroud)

为什么它完全忽略了这条线

void dosmth(Object obj) { System.out.println("X:Object"); }
Run Code Online (Sandbox Code Playgroud)

为什么null对应Double而不是Object?

另外,如果我添加这一行:

void dosmth(Integer obj) {System.out.println("X:Integer"); }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

both method dosmth(java.lang.Integer) and method dosmth(java.lang.Double) match
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 12

选择重载方法时,null可以对应任何引用类型.当有两个候选人 - Object并且Double在你的情况下 - 选择最具体的一个 - Double(Double更具体,Object因为它是一个子类Object).

当你介绍void dosmth(Integer obj),有三位候选人- Object,Double以及Integer-但由于没有Double也不Integer比其他更具体的-编译器不能再进行选择,你会得到一个错误.

正如FINDarkside所提到的,如果您选择了哪种特定方法,则可以将其null转换为所需类型.

例如,这将强制编译器选择void dosmth(Object obj):

x.dosmth((Object)null);
Run Code Online (Sandbox Code Playgroud)