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>
, поскольку теперь он будет содержать элемент, отличный от T
. Обратите внимание, что это не может быть гарантировано для изменяемых коллекций, поэтому все такие сужения изменяемых коллекций были бы по своей сути небезопасными.