我试图使用扩展方法在 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;
}
}
答案 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();