为什么Array和Integer构造函数不明确

时间:2014-11-10 00:44:49

标签: java

我在eclipse中编写了这个程序,eclipse抱怨构造函数是ambigious。我不确定为什么java编译器会将它们称为模糊不清。

public class Ambigious {

    public Ambigious(float[] a){
        System.out.println("array constructor");
    }


    public Ambigious(Integer a){
        System.out.println("Integer constructor");
    }

    public static void main(String[] args) {
        new Ambigious(null);
    }

}

但这不是

public class Ambigious {

    public Ambigious(Object a){
        System.out.println("object constructor");
    }

    public Ambigious(float[] a){
        System.out.println("array constructor");
    }

    public static void main(String[] args) {
        new Ambigious(null);
    }

}

2 个答案:

答案 0 :(得分:7)

问题1:
float[]Integer都是对象,因此null可以应用于两个构造函数。

由于没有任何最适合的类型编译器无法决定应该使用哪一个。

问题2:
如果是ObjectInteger类型,则选择最适合的类型。例如,如果您将new Integer(1)作为参数传递,则可以应用两个构造函数,因为Integer也是Object,但编译器将此调用与具有最精确参数类型的构造函数的代码绑定。 /> 与null类似,因为它可以用作ObjectInteger编译器,假设更精确的类型为Integer


要解决此类问题,您可以通过强制转换

指定null应表示的类型
new Ambigious((Integer)null);

您也可以尝试将其中一种参数类型更改为非对象,如

public Ambigious(int a){//primitive type

而不是

public Ambigious(Integer a){

答案 1 :(得分:3)

正如异常提出的那样,reference to Ambigious is ambiguous, both constructor Ambigious(float[]) in Ambigious and constructor Ambigious(Integer) in Ambigious match

这意味着两个构造函数都可以获取您传递的值,即null