.cast() 和 List.from() 和 List.castFrom() 有什么区别

Taz*_*Taz 6 dart flutter dart-2

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)
Run Code Online (Sandbox Code Playgroud)

有什么不同?

fzy*_*cjy 6

附加问题的答案(“对于一个何时有效而另一个何时失败的任何实际差异(不仅仅是引用/共享文档),我们将不胜感激。”):

当你有一个巨大的数组时,复制它 ( 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> {
...
}
Run Code Online (Sandbox Code Playgroud)

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