为什么Optional <T>被声明为最终类?

ski*_*iwi 14 java java-8

我正在玩下面的问题:在Stream :: flatMap中使用Java 8的Optional,并希望将一个方法添加到自定义中Optional<T>,然后检查它是否有效.
更准确地说,我想添加一个stream()我的CustomOptional<T>,如果没有值,则返回一个空流,或者如果存在,则返回一个包含单个元素的流.

但是,我得出的结论Optional<T>是宣布为最终结论.

为什么会这样?有很多类没有被声明为final,我个人认为没有理由宣布Optional<T>final.

作为第二个问题,为什么所有的方法都不能是最终的,如果担心它们会被覆盖,并且让课程不是最终的?

Sha*_*ght 15

根据Java SE 8 API文档的这个页面,Optional<T>是一个基于值的类.根据API文档的这一页,基于值的类必须是不可变的.

将所有方法声明Optional<T>为final将阻止方法被覆盖,但这不会阻止扩展类添加字段和方法.扩展类并添加一个字段以及一个改变该字段值的方法将使该子类可变,从而允许创建一个mutable Optional<T>.以下是此类子类的示例,如果Optional<T>不将其声明为final ,则可以创建该子类.

//Example created by @assylias
public class Sub<T> extends Optional<T> {
    private T t;

    public void set(T t) {
        this.t = t;
    }
}
Run Code Online (Sandbox Code Playgroud)

声明Optional<T>final可以防止像上面那样创建子类,因此保证Optional<T>始终是不可变的.