Как расширить последовательность вавр? - PullRequest
0 голосов
/ 11 июля 2020

Я заметил, что narrow метод существует для последовательностей. Как можно go поступить наоборот, перейти от последовательности подкласса к последовательности суперкласса безопасным для типов способом?

1 Ответ

1 голос
/ 12 июля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...