为什么Java认为我的构造函数调用不明确?

时间:2015-09-02 13:43:57

标签: java eclipse polymorphism java-6

我在java应用程序中有以下代码:

UserMessage um = new UserMessage("a string", 
                                 false, 
                                 "another String", 
                                 "one last string");

Eclipse告诉我这行代码有错误:

The constructor UserMessage(String, Object[]) is ambiguous  

UserMessage的所有构造函数的签名是:

1. public UserMessage(String key)
2. public UserMessage(String key, boolean escapeHTML, Object... args)
3. public UserMessage(String key, Object... args)
4. public UserMessage(ErrorCode code)
5. public UserMessage(ErrorCode code, Object... args)

对我来说,似乎很明显我打电话的构造函数应该指向上面的#2。该错误似乎告诉我它认为它可能指向第三个构造函数。

为什么这次通话有歧义?我唯一能想到的是false是由于某种原因被投放到Boolean对象,但显然不是我的代码所做的 - 所以这必须是java编译器本身就是这样做的。

1 个答案:

答案 0 :(得分:5)

将布尔值自动装箱到布尔值中似乎是一个问题,因此编译器无法判断构造函数是否在varargs对象数组(#2)中传递了一个String,一个布尔值和两个字符串,或者一个String和一个包含Boolean,String和另一个String(#3)的varargs Object数组。

"There is a strong synergy between autoboxing and varargs,"

ETA:如果您想区分构造函数,可以尝试将Object ... varargs更改为String ... varargs,如果在您的实现中可行的话。这应该可以防止布尔值自动装入布尔值,从而在构造函数#2和#3之间产生歧义。

ETA2:刚刚在Eclipse中检查了我的建议,并将构造函数中的Object ... varargs更改为String ... varargs消除了歧义错误,因此看起来问题是将布尔值自动装箱为布尔值。 / p>