public class test {
test(double[] a)
{
System.out.println("in double");
}
test(Object a)
{
System.out.println("in object");
}
public static void main(String args[])
{
new test(null);
}
}在上面的代码中,我传递null作为构造函数参数。由于null可以是任何东西,所以上面的代码编译得很好。当我运行代码时,我期望它在对象中打印,但是它打印成双倍,这背后的原因是什么?
注意:链接的问题可能不会重复,因为这个问题与原始数据类型vs对象有关。
发布于 2015-06-15 16:55:16
原因是Java将null解释为任何类型,在选择要调用的方法时,它将选择最具体的方法,首先是参数类型。因为null可以是double[]类型,而double[]是Object,所以编译器将选择接受double[]的方法。如果选择涉及同样可能但不相关的类型,例如double[]和String,那么编译器将无法选择一个方法,这将导致方法调用错误。
JLS,第4.1节声明:
空引用总是可以分配或转换给任何引用类型(§5.2,§5.3,§5.5)。 在实践中,程序员可以忽略空类型,而只是假装null只是一个特殊的文字,可以是任何引用类型。
发布于 2015-06-15 16:54:28
这两个构造函数都适用,因为null可以转换为Object和double[],所以编译器需要使用重载解析来确定要调用哪个构造函数。
JLS 15.9.3使用JLS 15.12.2来确定要使用的“最特定”构造函数签名,根据JLS 15.12.2.5的说法,基于哪个构造函数具有最特定的参数类型。确切的细节有点模糊(IMO),但在本例中,“如果您可以将T1转换为T2,但不能将T2转换为T1,那么T1更具体”的基本经验规则就足够了。
double[]是一个比Object更具体的类型,因为有一个从double[]到Object的隐式转换,反之亦然。
https://stackoverflow.com/questions/30850695
复制相似问题