如何加宽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
的元素。请注意,这不能保证可变集合,因此所有此类缩小可变集合本质上都是不安全的。
我注意到序列存在 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
的元素。请注意,这不能保证可变集合,因此所有此类缩小可变集合本质上都是不安全的。