Java 空 Optional 的类型是什么?

Ign*_*rez 3 java optional

所以问题是我正在检查OptionalJava 类,我在public static<T> Optional<T> empty()文档中注意到了这一点:

@param <T> The type of the non-existent value*.
Run Code Online (Sandbox Code Playgroud)

而且,在查看了整个班级并搜索了这里和其他几页之后,我遇到了这个我无法回答的问题:

  1. Optional可以有特定的类型吗?1.1 如果是,如何设置?1.2 有没有办法检查它的类型?

Ric*_*ick 6

Optional是可能包含特定元素的容器。因此,它有两个概念:

  • 它可能包含的类型
  • 它包含的实际对象

它可能包含的类型是通过泛型指定的。泛型仅在编译时存在,在运行时丢失。

回答您的问题:

  1. 使用 an 时Optional,您通常将其定义为可能包含一个类型,如下所示:
Optional<String> optionalString;
Run Code Online (Sandbox Code Playgroud)

此时我们知道optionalString 可能包含一个字符串。如果我们这样做:

Optional<String> optionalString = Optional.empty();
Run Code Online (Sandbox Code Playgroud)

它实际上不包含任何内容,但我们可以在任何Optional<String>需要的地方使用它。

  1. 的类型Optional是通过其用法推断的。与上面一样,您将 指定Optional.empty()Optional<String>. 您还可以通过方法的返回值指定其类型,如下所示:
public Optional<Integer> findNumber() {
    return Optional.empty();
}
Run Code Online (Sandbox Code Playgroud)
  1. 由于该类型在运行时不再存在,因此此时无法检查可选内容包含的内容。在运行时,空Optional没有类型。


Pau*_*aul 5

它是您指定的任何类型:

// Empty Optional with value type String
Optional<String> opt = Optional.empty();
Run Code Online (Sandbox Code Playgroud)

这是OpenJDK 11 中该方法的源代码

    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }
Run Code Online (Sandbox Code Playgroud)

EMPTY 是一个静态实例(来自上面链接的源代码):

    /**
     * Common instance for {@code empty()}.
     */
    private static final Optional<?> EMPTY = new Optional<>();
Run Code Online (Sandbox Code Playgroud)