为什么 Java 认为我的构造函数调用不明确?
Why does Java think my constructor call is ambiguous?
我在 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 编译器自己做。
将布尔值自动装箱为布尔值似乎是一个问题,因此编译器无法判断是否向构造函数传递了一个字符串、一个布尔值和可变参数对象数组中的两个字符串 (#2) ,或一个字符串和一个可变参数对象数组,其中包含一个布尔值、一个字符串和另一个字符串 (#3)。
"There is a strong synergy between autoboxing and varargs,"
ETA:如果您想区分构造函数,您可以尝试将 Object...varargs 更改为 String...varargs ,如果这在您的实现中可能的话。这应该可以防止将布尔值自动装箱为布尔值,从而在构造函数 #2 和 #3 之间产生歧义。
ETA2:刚刚检查了我在 Eclipse 中的建议,并将构造函数中的 Object...varargs 更改为 String...varargs 消除了歧义错误,因此看起来问题是将布尔值自动装箱为布尔值.
我在 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 编译器自己做。
将布尔值自动装箱为布尔值似乎是一个问题,因此编译器无法判断是否向构造函数传递了一个字符串、一个布尔值和可变参数对象数组中的两个字符串 (#2) ,或一个字符串和一个可变参数对象数组,其中包含一个布尔值、一个字符串和另一个字符串 (#3)。
"There is a strong synergy between autoboxing and varargs,"
ETA:如果您想区分构造函数,您可以尝试将 Object...varargs 更改为 String...varargs ,如果这在您的实现中可能的话。这应该可以防止将布尔值自动装箱为布尔值,从而在构造函数 #2 和 #3 之间产生歧义。
ETA2:刚刚检查了我在 Eclipse 中的建议,并将构造函数中的 Object...varargs 更改为 String...varargs 消除了歧义错误,因此看起来问题是将布尔值自动装箱为布尔值.