2011-02-05 482 views
3

我使用Google Guava r08和JDK 1.6.0_23。Google Guava:如何使用ImmutableSortedMap.naturalOrder?

我想使用構建器創建一個ImmutableSortedMap。我知道我可以創建這樣的建設者:

ImmutableSortedMap.Builder<Integer, String> b1 = 
    new ImmutableSortedMap.Builder<Integer, String>(Ordering.natural()); 

,然後用它來建立映射,例如:

ImmutableSortedMap<Integer, String> map = 
    b1.put(1, "one").put(2, "two").put(3, "three").build(); 

我注意到類ImmutableSortedMap有一個方法naturalOrder()與自然返回Builder排序。但是,當我嘗試調用此方法時,出現奇怪的錯誤。例如,這給出了一個奇怪的「預期」的錯誤:

// Does not compile 
ImmutableSortedMap.Builder<Integer, String> b2 = 
    ImmutableSortedMap<Integer, String>.naturalOrder(); 

什麼是正確的語法來調用naturalOrder()方法?

該方法的API文檔提到了一些編譯器錯誤。這有什麼關係,這種方法無法正常工作?

編輯

MForster的回答是好。但離開過仿製藥的時候,我不能這樣做 「一次」:

// Doesn't work, can't infer the types properly 
ImmutableSortedMap<Integer, String> map = 
    ImmutableSortedMap.naturalOrder().put(1, "one").put(2, "two").put(3, "three").build(); 

這並不工作:

ImmutableSortedMap<Integer, String> map = 
    ImmutableSortedMap.<Integer, String>naturalOrder().put(1, "one").put(2, "two").put(3, "three").build(); 
+1

是的,如果你建立在一系列鏈式調用的全地圖,你必須放置`ImmutableSortedMap。 naturalOrder()`。 Java無法推斷`naturalOrder()`調用的類型參數,因爲它返回的`Builder`不會被分配給任何東西。 – ColinD 2011-02-05 15:14:54

回答

10

正確的語法是

ImmutableSortedMap.Builder<Integer, String> b2 = 
    ImmutableSortedMap.<Integer, String>naturalOrder(); 

你可以完全放棄仿製藥,因爲在這種情況下推斷它們是:

ImmutableSortedMap.Builder<Integer, String> b2 = 
    ImmutableSortedMap.naturalOrder(); 
+0

啊,就這麼簡單!謝謝。 – Jesper 2011-02-05 13:07:22

5

正確的語法應爲:

ImmutableSortedMap.Builder<Integer, String> b2 = 
ImmutableSortedMap.<Integer, String>naturalOrder(); 

(注意泛型參數是點後面,而不是之前)