Java构造函数无法使用varargs

时间:2014-04-08 13:34:36

标签: java

我有以下枚举,其中包含许多构造函数:

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个构造函数?

3 个答案:

答案 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) {}