2014-04-08 74 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類型。

有你的衝突。