java - 为什么Java更喜欢调用双构造函数?

标签 java constructor

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 可以是任何东西,所以上面的代码编译得很好。当我运行代码时,我希望它打印 in object 但它打印 in double 这背后的原因是什么?

注意链接的问题可能不重复,因为这个问题与原始数据类型和对象有关

最佳答案

原因是 Java 将 null 解释为任何类型,并且在选择要调用的方法时,它会选择首先是参数类型的最具体的方法。因为 null 可以是 double[] 类型,而 double[] 是一个 Object,编译器将选择采用double[] 的方法。如果选择涉及同样可能但不相关的类型,例如double[]String,那么编译器将无法选择方法,这将导致模棱两可的方法调用错误。

JLS, Section 4.1 , 状态:

The null reference can always be assigned or cast to any reference type (§5.2, §5.3, §5.5).

In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type.

关于java - 为什么Java更喜欢调用双构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30850695/

相关文章:

java - 如何从 Android 中的普通 Activity 启动 MapActivity

插入时发生 Java 一般错误...???

java - Hibernate.initialize() 和二级缓存

java - 防止 Android Activity 对话框在外部触摸时关闭

c++ - 有没有办法让构造函数接受两种可能的参数类型?

java - Mapstruct:嵌套对象的自定义映射方法

java - C++ this 在构造函数中?

c++ - 我真的需要为 const 对象实现用户提供的构造函数吗?

c++ - 是否可以将成员初始化推迟到构造函数主体?

Java 反射 - 使用接受接口(interface)作为参数的公共(public)构造函数调用 protected 类