flutter - 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”。
解决方案
由于 T 扩展了 DataModel,它应该允许分配 DataModel 的实例,但不是。
不,不应该。这很简单: APack<Wolf>
类似于Pack<T extends Animal>
,但这并不意味着您可以将任何动物添加到狼群中,也不能将任何不是 wolf
(比如说Sheep
)的 Animal 派生类添加到 a Pack<Wolf>
。只能添加另一个Wolf
。如果您希望能够添加任何动物,也许泛型不是要走的路,您应该使用接口或基类。