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