使用Guava的Optional
类型作为方法参数的一个问题是你不能简单地写
// method declaration
public void foo(Optional<String> arg);
// compiler error
foo(Optional.absent());
由于类型推断失败,而是必须明确添加类型:
// real method call
foo(Optional.<String> absent());
我该如何避免呢?
答案 0 :(得分:7)
如果您正在处理一小组Optional<>
类型(例如,主要是字符串或少数其他类型),只需创建一些帮助方法为您绑定类型参数:
public final class AbsentValues {
public static Optional<String> absentString() {
return Optional.<String>absent();
}
}
您甚至可以静态导入这些内容以获得更清晰的代码:
import static AbsentValues.*;
...
foo(absentString());
对于不太常见的Optional<>
类型,只需明确指定type参数即可。它可能不漂亮,但它是正确的。
答案 1 :(得分:-1)
所以,这是正确的方法。如果不是其他任何东西,请至少在这里展示它以供我自己将来参考,对于每个不读问题的人,比如我自己:)感谢ColinD(和Alexey)。
foo(Optional.<String>absent())
答案 2 :(得分:-4)
在撰写问题时,我想到了
public class GuavaConstants {
@SuppressWarnings( { "raw" })
public static final Optional ABSENT = Optional.absent();
// similar for empty ImmutableList, etc.
}
然后调用看起来像
@SuppressWarnings( { "unchecked" })
foo(GuavaConstants.ABSENT);
有更好的方法吗?