2012-08-01 250 views
17

的一個問題用番石榴的Optional類型的方法的參數是,你不能簡單地寫傳遞Optional.absent()值的方法簡潔

// method declaration 
public void foo(Optional<String> arg); 

// compiler error 
foo(Optional.absent()); 

由於類型推斷失敗,而是必須添加類型明確:

// real method call 
foo(Optional.<String> absent()); 

我該如何避免它?

+6

有沒有更好的方法,但FYI,'可選的'往往比方法參數類型更常用作返回值。 (忘記來自方法的返回值可能比您正在編寫的方法的參數爲空更容易) – 2012-08-01 12:31:53

+0

對於複雜的表達式,我使用了適當類型的局部變量(在分配的RHS上不需要類型變量)以獲得更可讀的內容。但是,在解決方案來臨之前(可能是JDK8),這裏什麼都不能做。 – maaartinus 2012-08-01 15:28:01

+3

@LouisWasserman使用'Optional'作爲參數仍然有好處:1)向API的用戶明確說明可以缺少參數; 2)可以很容易地將另一種方法的返回值傳遞給你的方法。 – 2012-08-01 21:03:42

回答

-4

只是寫的問題時,我認爲有

public class GuavaConstants { 
    @SuppressWarnings({ "raw" }) 
    public static final Optional ABSENT = Optional.absent(); 

    // similar for empty ImmutableList, etc. 
} 

和則呼叫可以像

@SuppressWarnings({ "unchecked" }) 
foo(GuavaConstants.ABSENT); 

有沒有更好的方法嗎?

+16

是的,'foo(可選。缺席())'更好。這不會讓我感到你應該做的一切。 – ColinD 2012-08-01 22:30:45

+3

@ColinD,請將其作爲回答發佈,我會立即投票贊成。被接受的(也是唯一的)答案是相當討厭的。 – 2013-07-17 15:58:10

7

如果你正在處理一小部分Optional<>類型(例如,多串或其他類型的少數),只需創建一個綁定類型參數給你一些輔助方法:

public final class AbsentValues { 
    public static Optional<String> absentString() { 
     return Optional.<String>absent(); 
    } 
} 

你可以即使導入這些靜態到更清潔代碼:

import static AbsentValues.*; 

... 

foo(absentString()); 

對於不太常見Optional<>類型,只需指定類型參數明確。它可能不漂亮,但它是正確的。

-1

所以,這是做到這一點的正確方法。如果不是其他任何東西,讓我至少在這裏展示給我自己的未來參考,對於沒有閱讀過問題的人,比如我自己:)感謝ColinD(和Alexey)。

foo(Optional.<String>absent())