gpt4 book ai didi

list - 在 Dart 中,List.from 和 .of、Map.from 和 .of 之间有什么区别?

转载 作者:行者123 更新时间:2023-12-02 07:09:18 26 4
gpt4 key购买 nike

在 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 中具体化了,并且您不能使用强制转换或原始类型来更改列表/映射类型?

最佳答案

from 之间的重要区别和of方法的区别是后者有类型注释而前者没有。由于 Dart 泛型是具体化的,而 Dart 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.fromMap.from都是很好的例子,因为Iterable/Map传递给它们的参数没有类型参数。有时 Dart 可以计算出该对象的类型应该是什么,但有时它只是以 List<dynamic> 结束。或Map<dynamic, dynamic> .

在 Dart 2 中,类型 dynamic从同时为顶部(对象)和底部(空)类型更改为仅作为顶部类型。因此,如果您创建了 List<dynamic>意外地,在 Dart 1 中,您仍然可以将其传递给需要 List<String> 的方法。 。但在 Dart 2 中 List<dynamic>几乎与 List<Object> 相同,所以这会失败。

如果您使用 Dart 2,则应始终使用这些 API 的类型化版本。为什么旧的仍然存在,那里有什么计划?我真的不知道。我猜想随着时间的推移,它们将会与 Dart 1 的其余部分一起被淘汰。

关于list - 在 Dart 中,List.from 和 .of、Map.from 和 .of 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50320220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com