我在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);
}
}
答案 0 :(得分:7)
问题1:
float[]
和Integer
都是对象,因此null
可以应用于两个构造函数。
由于没有任何最适合的类型编译器无法决定应该使用哪一个。
问题2:
如果是Object
和Integer
类型,则选择最适合的类型。例如,如果您将new Integer(1)
作为参数传递,则可以应用两个构造函数,因为Integer
也是Object
,但编译器将此调用与具有最精确参数类型的构造函数的代码绑定。 />
与null
类似,因为它可以用作Object
和Integer
编译器,假设更精确的类型为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
。