首页 > 解决方案 > Flutter:泛型分配不适用于 T 的扩展类型

问题描述

为什么这个泛型类会抛出错误?因为T extends DataModel,它应该允许分配实例DataModel但不是。

class TestClass<T extends DataModel> {
  List<T> variablesList = [];
  late T variable;

  void run() {
    variablesList.add(DataModel(id: '', name: '', value: '')); // error
    variable = DataModel(id: '', name: '', value: ''); // error
  }

  void run2() {
    variablesList.add(DateModelImpl(id: '', name: '', value: '')); // error
    variable = DateModelImpl(id: '', name: '', value: ''); // error
  }
}

class DataModel {
  final String id;
  final String name;
  final String value;

  DataModel({
    required this.id,
    required this.name,
    required this.value,
  });
}

class DateModelImpl extends DataModel {
  DateModelImpl({
    required String id,
    required String name,
    required String value,
  }) : super(id: id, name: name, value: value);
}

错误:

参数类型“DataModel”不能分配给参数类型“T”。

参数类型“DateModelImpl”不能分配给参数类型“T”。

标签: flutterdartgenerics

解决方案


由于 T 扩展了 DataModel,它应该允许分配 DataModel 的实例,但不是。

不,不应该。这很简单: APack<Wolf>类似于Pack<T extends Animal>,但这并不意味着您可以将任何动物添加到狼群中,也不能将任何不是 wolf(比如说Sheep)的 Animal 派生类添加到 a Pack<Wolf>。只能添加另一个Wolf。如果您希望能够添加任何动物,也许泛型不是要走的路,您应该使用接口或基类。


推荐阅读