所以问题是我正在检查OptionalJava 类,我在public static<T> Optional<T> empty()文档中注意到了这一点:
@param <T> The type of the non-existent value*.
Run Code Online (Sandbox Code Playgroud)
而且,在查看了整个班级并搜索了这里和其他几页之后,我遇到了这个我无法回答的问题:
Optional可以有特定的类型吗?1.1 如果是,如何设置?1.2 有没有办法检查它的类型?类Optional是可能包含特定元素的容器。因此,它有两个概念:
它可能包含的类型是通过泛型指定的。泛型仅在编译时存在,在运行时丢失。
回答您的问题:
Optional,您通常将其定义为可能包含一个类型,如下所示:Optional<String> optionalString;
Run Code Online (Sandbox Code Playgroud)
此时我们知道optionalString 可能包含一个字符串。如果我们这样做:
Optional<String> optionalString = Optional.empty();
Run Code Online (Sandbox Code Playgroud)
它实际上不包含任何内容,但我们可以在任何Optional<String>需要的地方使用它。
Optional是通过其用法推断的。与上面一样,您将 指定Optional.empty()为Optional<String>. 您还可以通过方法的返回值指定其类型,如下所示:public Optional<Integer> findNumber() {
return Optional.empty();
}
Run Code Online (Sandbox Code Playgroud)
Optional没有类型。它是您指定的任何类型:
// 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)