当使用值null作为参数时,Java解析重载的方法调用

时间:2013-10-18 17:31:30

标签: java null method-dispatch

如果还有method(char[] a)而不是生成模糊方法错误,为什么Java会为method(null)执行method(Object a)


尝试使用静态方法String.valueOf()构建字符串时......我面对这种情况。请参阅下面的自解释运行示例:

public class NotSoClearNullPointerException {

  public static void main(String[] args) {

    NotSoClearNullPointerException instance = new NotSoClearNullPointerException ();
    instance.algo(null);
    String str =  String.valueOf(instance.getANull());
    System.out.println ("This actually is beign send to stdout : " + str);
    str =  String.valueOf(null);
    System.out.println ("We never gonna make it to stdout!! : " + str);


  }

  public Object getANull() {
    return null; // the hardest method i ever wrote... xD
  }

}

检查String class的来源后,我看到String.valueOf(Object)方法是空的安全!!,所以String.valueOf(null)实际上并没有调用String.valueOf(Object)方法,而是调用另一个重载方法..我猜是调用String.valueOf(char[]),知道每个数组(尽管base type)是一个对象。

我非常肯定这是因为我自己做了测试,再次准备好运行代码 -

public class ArgumentDispatchExample {

  public static void main(String[] args) {

    ArgumentDispatchExample instance = new ArgumentDispatchExample ();
    instance.method(null);
  }

  public void method (Object a) {
    System.out.println("Object");
  }


  public void method (char[] a) {
    System.out.println("char[]");
  }

}

假设我是对的...(顺便说一句,这是问题的一部分......),我一直认为这个调用必须产生一个模糊的错误,因为如果编译器必须关联“ null“到一个Object或char []实例。

Java不支持双调度(即解析调用实际类型参数的调用方法),那么在这里使用什么样的规则来决定将null作为char []?我的一生,我的事物是null更接近于对象“事物”,而不是其他类型的抽象。

哪种类型的“更多”与空值相关联?

我急切地等待答案!!

素不相识。

维克多

P.D。:作为HPO(谦逊的个人观点)......难道我们不同意这有点令人困惑,特别是如果你看第一个例子......?也许,这是一个很好的起点,可以在java社区中进行辩论。 非常感谢!。

0 个答案:

没有答案