如何加宽vavr序列?

How to widen a vavr sequence?

我注意到序列存在 narrow method。如何做相反的事情,以类型安全的方式从子类的序列到超类的序列?

Seq.narrow() 正是这样做的:从某种类型 T 的序列到该类型 T.[=26= 的超类型 S 的序列]

编译以下示例:

class Superclass {}
class Subclass extends Superclass {}

class Test {
    void test() {
        Seq<Subclass> subs = List.of(new Subclass(), new Subclass());
        Seq<Superclass> supers = Seq.narrow(subs);
        // both 'subs' and 'supers' are safe to use
    }
}

这是可行的,因为 vavr 集合是不可变的,所以当您有一个 Seq<T> 时,您可以确定序列中的所有值也是 S 类型的值。由于您无法更改 vavr 集合,因此 缩小 Seq<T>Seq<S> 的引用始终是安全的(T 是 [=13= 的子类型]), 因为您永远无法通过向其中添加类型 S 的值来更改原始 Seq<T> 。这将违反原始 Seq<T> 的类型安全,因为现在它将包含一个不是 T 的元素。请注意,这不能保证可变集合,因此所有此类缩小可变集合本质上都是不安全的。