4

List foo -> List bar
我可以使用三种方法

1.List<MyClass> bar = foo.cast<MyClass>()
2.List<MyClass> bar = List.castFrom(foo)
3.List<MyClass> bar = List.from(foo)

有什么区别?

4

2 回答 2

3

附加问题的答案(“任何实际差异(不仅仅是引用/共享文档)关于何时可以工作而另一个失败将不胜感激。”):

当你有一个巨大数组时,复制它(List.from相反,您将要使用List.cast,它只会返回一个视图并且不会从列表中复制所有内容。那是什么时候List.cast会起作用而其他会失败的情况。确实,不是失败,而是不好。

由于“[List.cast is] 通常实现为 List.castFrom<E, R>(this)”,因此上述示例也适用List.castFrom

至于我们什么时候应该使用List.from而不是其他两个,请考虑以下情况:您有 List a,并希望将其复制到 listb并对其进行一些修改b。如果您只想修改b但想a保留原始文件,则应使用List.from复制(克隆)而不是List.cast.

简而言之:List.cast几乎与List.castFrom. 他们都没有复制任何东西。List.from复制一切。


确实,你也可以看看源代码:static List<T> castFrom<S, T>(List<S> source) => CastList<S, T>(source);CastList实现为:


abstract class _CastListBase<S, T> extends _CastIterableBase<S, T>
    with ListMixin<T> {
  List<S> get _source;

  T operator [](int index) => _source[index] as T;

...
}

class CastList<S, T> extends _CastListBase<S, T> {
...
}

因此,您可以非常清楚地看到,当您这样做cast(或castFrom)时,您不会复制并创建一个新列表,而只是制作一个非常薄的包装器。每当您使用它时,该包装器都会进行类型转换。

于 2021-09-09T12:17:55.400 回答
3
  1. cast<MyClass>:返回包含 MyClass 类型实例的 List 的视图(不可变列表,更改列表的顺序不会反映在原始列表中)。请关注
  2. castFrom(foo): 将源 (foo) 调整为列表。请关注
  3. from(foo):从参数中提供的可迭代(foo)对象创建一个列表。请关注
于 2020-02-03T06:50:11.267 回答