【问题标题】:Flutter: Generics assignment is not working on extended types of TFlutter:泛型分配不适用于 T 的扩展类型
【发布时间】:2021-11-03 01:37:10
【问题描述】:

为什么这个泛型类会抛出错误?由于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”。

【问题讨论】:

    标签: flutter dart generics


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2018-09-19
      • 2017-11-18
      • 2019-10-18
      相关资源
      最近更新 更多