20

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

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

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

由于类型推断失败,而是必须显式添加类型:

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

我怎样才能避免它?

4

3 回答 3

8

如果您正在处理一小组Optional<>类型(例如,主要是字符串或少数其他类型),只需创建一些为您绑定类型参数的辅助方法:

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

您甚至可以静态导入这些以生成更简洁的代码:

import static AbsentValues.*;

...

foo(absentString());

对于不太常见Optional<>的类型,只需明确指定类型参数。它可能不漂亮,但它是正确的。

于 2014-05-30T16:48:41.377 回答
-1

因此,这是执行此操作的正确方法。如果没有别的原因,让我至少在这里展示一下,以供我自己将来参考,供像我这样不阅读问题的每个人使用 :) 感谢 ColinD(和 Alexey)。

foo(Optional.<String>absent())
于 2017-06-26T08:40:45.533 回答
-4

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

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

    // similar for empty ImmutableList, etc.
}

然后电话看起来像

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

有更好的方法吗?

于 2012-08-01T11:09:11.130 回答