使用null的方法重载选择

Law*_*Dol 4 java overloading

鉴于此代码:

class Overloading
extends Object
{

static public void target(Object val, String chk) { System.out.println("Object["+val+"] :: Should be "+chk); }
static public void target(String val, String chk) { System.out.println("String["+val+"] :: Should be "+chk); }

static public void main(String[] args) {
    Object                              obj=null;

    target(null        ,"Object");
    target((Object)null,"Object");
    target(obj         ,"Object");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出(意外地)如下:

String[null] :: Should be Object
Object[null] :: Should be Object
Object[null] :: Should be Object
Run Code Online (Sandbox Code Playgroud)

问题在于第一行,我希望与另外两行相同.此外,我发誓,直到最近编译器才会给普通null调用一个模糊的调用警告.但是,使用Java 5和6进行编译和测试会产生相同的结果.

这对我来说是一个重要的问题,因为我有很多代码使用这种模式使用不同类型的重载"默认"参数来选择返回类型并推断所需的转换/解析.谁能解释一下这里发生了什么?

Ern*_*ill 6

Java始终以相同的方式工作:始终选择"最具体"的适用重载.既然String是它的子类Object,它是"更具体"的,并且String选择了重载.如果过载是对,说StringInteger,而你试图通过null,那么你的确会得到一个编译时多义性错误,因为它们都是在同一个继承层次的同一级别.