.cast() 和 List.from() 和 List.castFrom() 有啥区别

Posted

技术标签:

【中文标题】.cast() 和 List.from() 和 List.castFrom() 有啥区别【英文标题】:What is the difference among .cast() and List.from() and List.castFrom().cast() 和 List.from() 和 List.castFrom() 有什么区别 【发布时间】:2020-05-18 21:30:51 【问题描述】:

列表 foo -> 列表栏 我可以使用三种方法

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

有什么区别?

【问题讨论】:

【参考方案1】:

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

当您有一个 giant 数组时,复制它 (List.from) 将不是一个聪明的主意 - 您将花费大量时间复制所有内容,而且还会消耗大量内存.相反,您将希望使用List.cast,它只会返回一个视图,并且不会从列表中复制所有内容。这是List.cast 可以工作而其他人会失败的情况。确实,不失败,但不好。

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

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

简而言之:List.castList.castFrom 几乎相同。他们都复制任何东西。 List.from 复制所有内容。


确实也可以看源码:static List&lt;T&gt; castFrom&lt;S, T&gt;(List&lt;S&gt; source) =&gt; CastList&lt;S, T&gt;(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)时,您不会复制并创建新列表,而只会制作一个非常薄的包装器。每当您使用该包装器时,它都会进行类型转换。

【讨论】:

谢谢,我正在寻找这样的东西。稍后我会读一读 @iDecode 欢迎您!如果您觉得有用,请不要忘记奖励赏金;)【参考方案2】:
    cast&lt;MyClass&gt;:返回包含 MyClass 类型实例的 List 的 view(不可变列表,改变列表的顺序不会反映在原始列表中)。请follow。 castFrom(foo):将源 (foo) 改编为列表。请follow from(foo):从 Argument 中提供的 Iterable (foo) 对象创建一个列表。请follow

【讨论】:

以上是关于.cast() 和 List.from() 和 List.castFrom() 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

转static_cast和reinterpret_cast

什么时候应该使用 static_cast、dynamic_cast、const_cast 和 reinterpret_cast?

什么时候应该使用 static_cast、dynamic_cast、const_cast 和 reinterpret_cast?

static_cast和reinterpret_cast

static_castdynamic_castreinterpret_cast和const_cast

Android -- android.os.Parcelable[] cannot be cast to ...