Java 空可选的类型是什么?

What is the type of a Java empty Optional?

所以我正在检查 Optional Java class 我在 public static<T> Optional<T> empty() 文档中注意到了这一点:

@param <T> The type of the non-existent value*.

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

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

无论您指定什么类型:

// Empty Optional with value type String
Optional<String> opt = Optional.empty();

这是 OpenJDK 11 中该方法的source code

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

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

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

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

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

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

回答您的问题:

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

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

Optional<String> optionalString = Optional.empty();

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

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

我知道一篇 Link 的博文已经发布,但我总是在以下时间参考:Baeldung Java Optional 8

你的问题:

  1. 可选可以包含任何对象类型(如果你需要一个 int 然后使用 Integer)

  2. Optional.of(urObject) 现在“类型”是可选的

  3. 不,你不能检查可选的类型。