dart 中 List<T> 的深拷贝扩展

时间:2021-04-02 21:00:23

标签: dart

我试图使用扩展方法在 Dart 中制作 List 的深层副本。但我收到一个错误:

The argument type 'List<dynamic>' can't be assigned to the parameter type 'T'.

代码:

extension ListExtensions<T> on List<T> {
  List<T> get shallowClone {
    List<T> res = [];
    for (var elem in this) {
      if (elem is List<dynamic>) {
        res.add(elem.shallowClone);
      }
      else {
        res.add(elem);
      }
    }
    return res;
  }
}

1 个答案:

答案 0 :(得分:1)

另一种复制列表类型参数的方法:

extension ListClone<T> on List<T> {
  List<T> clone() {
    var copy = this.toList();
    List<Object?> untypedCopy = copy;
    for (var i = 0; i < untypedCopy.length; i++) {
      var element = untypedCopy[i];
      if (element is List) {
        untypedCopy[i] = element.clone();
      }
    }
    return copy;
  }
}

这会创建一个与原始元素类型相同的新列表(使用使用实际类型的 toList)。 然后它检查每个元素是否是一个列表,如果是这种情况,则克隆它。然后使用不健全的协方差将克隆分配回以使其成为运行时类型检查,这应该会成功,因为克隆具有与原始元素相同的类型。

示例:

// List<List<List<int>>> containing List<List<int>> containing List<int>
var list = [[[1]]];

// Ditto!
var clone = list.clone();