Java空Optional的类型是什么?

huangapple go评论76阅读模式
英文:

What is the type of a Java empty Optional?

问题

所以事实上我在查看 Optional Java 类时注意到在 public static<T> Optional<T> empty() 的文档中有这样的描述:

@param <T> 不存在值的类型*。

然后,在查看了整个类并在这里以及其他几个页面搜索后,我得出了以下问题,我还没有能够回答:

  1. 一个空的 Optional 可以拥有特定的类型吗?
    1.1 如果可以,如何设置呢?
    1.2 是否有任何方法可以检查它的类型?
英文:

So the thing is I was checking Optional Java class and I noticed this in the public static<T> Optional<T> empty() doc:

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

And, after looking at the whole class and searching over here and a few other pages I came to this questions that I haven't been able to answer:

  1. Can an empty Optional have a specific type?
    1.1 If so, how do you set it?
    1.2 And is there any way to check its type?

答案1

得分: 9

这是您指定的任意类型:

// 具有值类型为String的空Optional
Optional<String> opt = Optional.empty();

这是来自OpenJDK 11的该方法的源代码

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

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

    /**
     * {@code empty()}的常见实例。
     */
    private static final Optional<?> EMPTY = new Optional<>();
英文:

It's whatever type you specify:

// Empty Optional with value type String
Optional&lt;String&gt; opt = Optional.empty();

Here is the source code for that method from OpenJDK 11:

    public static&lt;T&gt; Optional&lt;T&gt; empty() {
        @SuppressWarnings(&quot;unchecked&quot;)
        Optional&lt;T&gt; t = (Optional&lt;T&gt;) EMPTY;
        return t;
    }

EMPTY is a static instance (from the source code linked above):

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

答案2

得分: 6

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

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

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

回答你的问题:

  1. 使用Optional时,通常会定义它可能包含的类型,就像这样:
Optional<String> optionalString;

在这一点上,我们知道optionalString可能包含一个字符串。如果我们这样做:

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

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

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

The Optional class is a container that might contain a specific element. As such, it has two concepts:

  • The type it might contain
  • The actual object it contains

The type it might contain is specified trough generics. Generics only exist at compile time and are lost at runtime.

To answer your questions:

  1. When using an Optional, you usually define it to possibly contain a type, like this:
Optional&lt;String&gt; optionalString;

At this point we know that optionalString might contain a String. If we do this:

Optional&lt;String&gt; optionalString = Optional.empty();

It doesn't actually contain anything, but we can use it anywhere an Optional&lt;String&gt; is required.

  1. The type of the Optional is inferred trough its usage. Like above, you specify the Optional.empty() to be an Optional&lt;String&gt;. You can also specify its type trough the return value of a method, like so:
public Optional&lt;Integer&gt; findNumber() {
    return Optional.empty();
}
  1. Since the type is no longer present at runtime, there is no way to check what the optional contains at this point. At runtime, an empty Optional has no type.

答案3

得分: 1

我知道博客文章的链接已经发布了,但我总是会参考这个链接:Baeldung Java Optional 8

关于你的问题:

  1. Optional 可以包含任何对象类型(如果你需要一个整数,那么使用 Integer)。

  2. Optional.of(urObject) 现在 "type" 是 Optional<typeOfUrObject>。

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

英文:

I know a Link to a Blogpost has already been posted, but I always refer back to this on: Baeldung Java Optional 8

To ur questions:

  1. Optional can contain any Object type(if u need an int then use Integer)

  2. Optional.of(urObject) now the "type" is Optional<typeOfUrObject>

  3. No u can't check the type of the Optional.

huangapple
  • 本文由 发表于 2020年10月2日 18:32:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/64170083.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定