2014-04-08 48 views
3

我有以下枚举具有多种构造的工作: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) {} 
} 

在这种情况下,我很清楚地调用构造函数4时,我定义HOMEPAGE。但问题是,我收到错误:Cannot resolve constructor Route(java.lang.String, null, com.foo.UserType)

如果我或者删除从构造,即在varags所以它看起来像:

Route(String baseName, String langFile, UserType availability) {} 

或者,如果我定义时HOMEPAGE,即改变空​​:

HOMEPAGE("", "", UserType.GUEST); 

然后,它的工作原理。但是这对我来说没有意义。为什么它没有检测到我在调用第4个构造函数?

回答

10

问题是null可能是StringUserType。所以:

HOMEPAGE("", null, UserType.GUEST); 

会匹配第三或第四个构造函数。铸造nullString将导致在第四构造被选择:

HOMEPAGE("", (String) null, UserType.GUEST); 
+0

我看...很棘手。感谢您澄清它。如果我将null转换为String,那么我的构造函数仍然会接受null作为该参数的值? –

+0

@ClickUpvote,是的,它将保持'空'。 – hmjd

+0

只是澄清,我不明白,因为第三个构造函数只有两个参数,并且调用显然传递了三个参数......如何将调用误认为第三个构造函数? – Gladhus

1

因为空可以是一个字符串或一用户类型:

Route(java.lang.String, null, com.foo.UserType) 

匹配与两个methodes:

Route(String langFile, UserType... availability) {} 
Route(String baseName, String langFile, UserType... availability) {} 
2

这是正确的,它不知道要选择哪个构造函数,您的电话是:

Route(String, null, UserType) 

这肯定不会引用前两个构造函数。

然而它可以参考Route(String, UserType),因为null可能是UserType类型。
它也可以参考Route(String, String, UserType),因为null可能是String类型。

有你的冲突。