【发布时间】:2020-08-05 12:14:22
【问题描述】:
我正在努力实现的目标
我正在尝试创建一个泛型 Dart 方法,该方法采用泛型类型 T,其中 T 必须实现类 IModel。然而,
问题
似乎我无法在类型 T 上设置 implements 约束,只能设置 extends。例如,<T implements IModel 不起作用,但 <T extends IModel> 起作用。
代码
IModel.dart 作为接口:
class IModel {
IModel();
factory IModel.fromJson(Map<String, dynamic> json) {
return IModel();
}
Map<String, dynamic> toJson() => {};
IModel clone() {
return IModel();
}
}
MyModel.dart,一个实现IModel的例子:
import 'dart:core';
import 'package:.../helpers/DateTimeHelper.dart';
import 'package:.../helpers/StringHelper.dart';
import 'package:.../models/IModel.dart';
class MyModel implements IModel {
String id;
String name;
String companyId;
String projectId;
String description;
DateTime created;
DateTime updated;
MyModel({this.id, this.name, this.description, this.created, this.updated, this.companyId, this.projectId});
factory MyModel.fromJson(Map<String, dynamic> json) {
return MyModel(id: json["id"], name: json["name"], created: DateTime.parse(json["created"]), updated: DateTime.parse(json["updated"]), description: json["description"], companyId: json["companyId"], projectId: json["projectId"]);
}
Map<String, dynamic> toJson() => {
"Id": id,
"Name": name,
"Description": description,
"CompanyId": companyId,
"ProjectId": projectId,
"Created": created.toIso8601String(),
"Updated": updated.toIso8601String()
};
MyModel clone() {
return new MyModel(id: StringHelper.clone(id), companyId: StringHelper.clone(companyId), created: DateTimeHelper.clone(created), updated: DateTimeHelper.clone(updated), name: StringHelper.clone(name), projectId: StringHelper.clone(projectId), description: StringHelper.clone(description));
}
}
带有泛型方法的ModelHelper.dart:
import 'dart:convert';
import 'package:.../models/IModel.dart';
// 'T implements IModel' not working, but 'T extends IModel' does as constraint.
abstract class ModelHelper {
static List<T> listFromJson<T implements IModel>(String json) {
List l = jsonDecode(json)["data"];
var models = l.map((m) => T.fromJson(m)).toList();
return models;
}
}
其他问题/结论
Dart 不支持 implements 约束吗?所有的 T 类都只需要扩展 IModel 吗?
【问题讨论】: