我有以下枚举,其中包含许多构造函数:
public enum Route
{
HOMEPAGE("", null, UserType.GUEST);
Route(String baseName, String langFile, Entity entity) {}
Route(String langFile, Entity entity) {}
Route(String langFile, UserType... availability) {}
Route(String baseName, String langFile, UserType... availability) {}
}
在这种情况下,我在定义HOMEPAGE
时非常清楚地调用了第4个构造函数。但问题是,我收到错误:Cannot resolve constructor Route(java.lang.String, null, com.foo.UserType)
。
如果我要么从构造函数中移除varags,那么它看起来像是:
Route(String baseName, String langFile, UserType availability) {}
或者,如果我在定义HOMEPAGE
时更改了null,即:
HOMEPAGE("", "", UserType.GUEST);
然后它有效。但这对我来说没有意义。为什么它没有检测到我正在调用第4个构造函数?
答案 0 :(得分:10)
问题是null
可以是String
还是UserType
。所以:
HOMEPAGE("", null, UserType.GUEST);
将匹配第三个或第四个构造函数。将null
转换为String
会导致选择第四个构造函数:
HOMEPAGE("", (String) null, UserType.GUEST);
答案 1 :(得分:2)
它是不正确的,它不知道要选择哪个构造函数,你的调用是:
Route(String, null, UserType)
这肯定不会引用前两个构造函数。
但它可以引用Route(String, UserType)
,因为null
可以是UserType
类型。
它也可以引用Route(String, String, UserType)
,因为null
可以是String
类型。
你的冲突。
答案 2 :(得分:1)
因为null可以是String或UserType:
Route(java.lang.String, null, com.foo.UserType)
与两种方法匹配:
Route(String langFile, UserType... availability) {}
Route(String baseName, String langFile, UserType... availability) {}