我在 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 编译器自己做的事情。
最佳答案
这看起来像是将 boolean 值自动装箱为 boolean 值的问题,因此编译器无法判断构造函数是否传递了一个字符串、一个 boolean 值和可变参数对象数组中的两个字符串(#2),或者一个字符串和一个可变参数对象数组,其中包含一个 boolean 值、一个字符串和另一个字符串 (#3)。
"There is a strong synergy between autoboxing and varargs,"
预计到达时间:如果您想区分构造函数,您可以尝试将 Object...varargs 更改为 String...varargs (如果您的实现中可以这样做)。这应该可以防止将 boolean 值自动装箱为 boolean 值,从而在构造函数 #2 和 #3 之间产生歧义。
ETA2:刚刚在 Eclipse 中检查了我的建议,并将构造函数中的 Object... varargs 更改为 String... varargs 消除了歧义错误,因此看起来问题是将 boolean 值自动装箱为 boolean 值。
关于java - 为什么 Java 认为我的构造函数调用不明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32354902/