当泛型方法返回'nothing'但null无法返回时返回什么?

Mar*_*mus 7 java generics optional java-8

假设我有一个像这样的库方法(非常简短):

public static <V> Optional<V> doSomethingWith(Callable<V> callable) {
    try {
        return Optional.of(callable.call());
    } catch (Exception ex) {
        // Do something with ex
        return Optional.empty();
    }
}
Run Code Online (Sandbox Code Playgroud)

而且我想要一些不会返回值的东西,例如:

    Library.</*What1*/>doSomethingWith(() -> {
        foo();
        return /*what2*/;
    });
Run Code Online (Sandbox Code Playgroud)

我对没有返回值的泛型方法的第一直觉是生成类型Void并返回null,但是因为结果被包装在一个Optional会抛出异常.

什么是合理的占位符/*What1*//*what2*/看上去并不完全随机的像Integer0

[编辑]我试图避免Optional.ofNullable因为这里使用空来表示callable.call()没有正常完成.

the*_*472 6

如果您需要一个永远不会被使用的泛型参数的类型提示Void,那么JDK在某些情况下也会这样做,例如,当转换RunnableCompletableFuture<T>它时使用Void for T.

如果你使用Optional.ofNullable那么你可以返回nullwhat2,这是唯一有效的值Void.

[edit]我试图避免Optional.ofNullable,因为这里使用empty表示callable.call()没有正常完成.

然后你正在使用错误的工具来完成工作.CompletionStage或者CompletableFuture有正确的语义.


The*_*tor 4

我通常用来Boolean.TRUE标记成功,但你Void.class也可以回来。两者都很便宜,因为并非每次返回都会创建一个要丢弃的新对象。但Class<Void>不仅仅是Void它也可以起到标记某些东西的目的void

正如已经提到的,您还可以创建自己的结果类/枚举。

或者你当然Optional.<Void>nothing()也可以回来。这样会产生一些结果Optional<Optional<Void>>,但也能达到目的。

如果您认为以上所有内容都很难看,那么我担心该 API 可能无法很好地满足您的需求。提出问题/拉取请求或寻找其他内容。