我在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编译器本身就是这样做的。
答案 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>