我注意到narrow method存在于序列中。我们将如何做相反的事情,以一种类型安全的方式从子类序列转到超类序列?
发布于 2020-07-12 00:36:39
Seq.narrow()正是这样做的:从某种类型的T序列到那种类型的超级S序列( T )。
下面的示例编译:
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是S的一个子类型),因为您永远不能通过向原始Seq<T>中添加S类型的值来更改原始Seq<T>。这将违反原始Seq<T>的类型安全性,因为现在它将包含一个不是T的元素。请注意,对于可变集合,不能保证这一点,因此,所有此类可变集合的缩小都具有内在的不安全性。
https://stackoverflow.com/questions/62850536
复制相似问题