В Dart, в чем разница между List.from и .of, и между Map.from и .of? - PullRequest
0 голосов
/ 13 мая 2018

В Dart, в чем разница между List.from и List.of и между Map.from и Map.of?Их документация не совсем ясна:

/**
* Creates a [LinkedHashMap] instance that contains all key/value pairs of
* [other].
*
* The keys must all be instances of [K] and the values of [V].
* The [other] map itself can have any type.
*
* A `LinkedHashMap` requires the keys to implement compatible
* `operator==` and `hashCode`, and it allows `null` as a key.
* It iterates in key insertion order.
*/
factory Map.from(Map other) = LinkedHashMap<K, V>.from;

/**
* Creates a [LinkedHashMap] with the same keys and values as [other].
*
* A `LinkedHashMap` requires the keys to implement compatible
* `operator==` and `hashCode`, and it allows `null` as a key.
* It iterates in key insertion order.
*/
factory Map.of(Map<K, V> other) = LinkedHashMap<K, V>.of;

/**
* Creates a list containing all [elements].
*
* The [Iterator] of [elements] provides the order of the elements.
*
* All the [elements] should be instances of [E].
* The `elements` iterable itself may have any element type, so this
* constructor can be used to down-cast a `List`, for example as:
* ```dart
* List<SuperType> superList = ...;
* List<SubType> subList =
*     new List<SubType>.from(superList.whereType<SubType>());
* ```
*
* This constructor creates a growable list when [growable] is true;
* otherwise, it returns a fixed-length list.
*/
external factory List.from(Iterable elements, {bool growable: true});

/**
* Creates a list from [elements].
*
* The [Iterator] of [elements] provides the order of the elements.
*
* This constructor creates a growable list when [growable] is true;
* otherwise, it returns a fixed-length list.
*/
factory List.of(Iterable<E> elements, {bool growable: true}) =>
  new List<E>.from(elements, growable: growable);

Связана ли разница с генериками?Может быть, фабрики .from позволяют вам изменять тип списка, а фабрики .of - нет?Я пришел из Java-фона, который работает со стиранием типов, и, возможно, типы переопределены в Dart, и вы не можете использовать приведение или необработанные типы для изменения типов списка / карты?

1 Ответ

0 голосов
/ 14 мая 2018

Важное различие между методами from и of заключается в том, что последние имеют аннотации типов, а первые - нет.Так как дженерики дротиков усовершенствованы, а дартс 2 строго типизированы, это является ключом к тому, чтобы обеспечить правильное построение List/Map:

List<String> foo = new List.from(<int>[1, 2, 3]); // okay until runtime.
List<String> bar = new List.of(<int>[1, 2, 3]); // analysis error

и гарантировать, что типы выводятся правильно:

var foo = new List.from(<int>[1, 2, 3]); // List<dynamic>
var bar = new List.of(<int>[1, 2, 3]); // List<int>

В Dart 1 типы были полностью необязательными, поэтому многие API были нетипизированы или частично напечатаны.List.from и Map.from являются хорошими примерами, поскольку переданные в них Iterable/Map не имеют параметра типа.Иногда Дарт может выяснить, каким должен быть тип этого объекта, но иногда он просто заканчивался как List<dynamic> или Map<dynamic, dynamic>.

В Дарт 2 тип dynamic был изменен с того, чтобы быть верхним(Object) и нижний (null) тип, чтобы быть только верхним типом.Таким образом, если вы случайно создали List<dynamic> в Dart 1, вы все равно можете передать его методу, который требует List<String>.Но в Dart 2 List<dynamic> почти совпадает с List<Object>, поэтому это не получится.

Если вы используете Dart 2, вы всегда должны использовать типизированную версию этих API.Почему старые все еще существуют, и какие планы там?Я действительно не знаю.Я предполагаю, что они будут постепенно сокращаться вместе с остальной частью Дротика 1.

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