Java 简洁地将可选的.emission()值传递给方法

Java 简洁地将可选的.emission()值传递给方法,java,generics,guava,Java,Generics,Guava,使用Guava的Optional类型作为方法参数的一个问题是,您不能简单地编写 // method declaration public void foo(Optional<String> arg); // compiler error foo(Optional.absent()); //方法声明 公共void foo(可选参数); //编译错误 foo(可选。缺席()); 由于类型推断失败,但必须显式添加类型: // real method call foo(Optional

使用Guava的
Optional
类型作为方法参数的一个问题是,您不能简单地编写

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

// compiler error
foo(Optional.absent());
//方法声明
公共void foo(可选参数);
//编译错误
foo(可选。缺席());
由于类型推断失败,但必须显式添加类型:

// real method call
foo(Optional.<String> absent());
//实方法调用
foo(可选。缺席());

我怎样才能避免呢?

就在写问题的时候,我想到了

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

    // similar for empty ImmutableList, etc.
}
然后这个电话看起来就像

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

有更好的方法吗?

如果您处理的是一小部分
可选
类型(例如,大多数是字符串或少数其他类型),只需创建一些帮助器方法来为您绑定类型参数:

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

对于不太常见的
可选
类型,只需显式指定type参数。它可能不漂亮,但它是正确的。

因此,这是正确的方法。如果不是为了别的什么,至少让我在这里展示一下,作为我自己将来的参考,给像我这样不看问题的人看:)感谢科林(和阿列克谢)

foo(可选。缺席())

实际上没有更好的方法,但仅供参考,
可选
通常用作返回值,而不是方法参数类型。(忘记方法的返回值可能比您正在编写的方法的参数更容易)对于一个复杂的表达式,我使用一个适当类型的局部变量(在赋值的RHS上,不需要类型变量),以获得更可读的内容。但是在解决问题之前(可能是JDK8),什么也做不了。@LouisWasserman使用
可选
作为参数仍然有好处:1)让API用户清楚地知道可以不使用参数;2) 使将另一个方法的返回值传递给您的方法变得容易。我将可选方法与Jersey框架结合使用。例如,调用该方法时可能未给出@QueryParameter。然而,当我编写单元测试时,我需要使用键入的缺席选项yes调用,
foo(Optional.缺席())
更好。这对我来说根本不是你应该做的事情。@ColinD,请把这篇文章作为一个答案,我会马上投票。公认的(也是唯一的)答案相当令人讨厌。
import static AbsentValues.*;

...

foo(absentString());
foo(Optional.<String>absent())