[英]Dart: doesn't override generic method has generic parameter type similar to the return type
[英]How to enforce Implements constraint on generic type T in generic Dart method?
我正在嘗試創建一個通用 Dart 方法,該方法采用通用類型 T,其中 T 必須實現 class 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();
}
}
WorkControlPlanModel.dart,一個實現IModel的例子:
import 'dart:core';
import 'package:knowe_personnelledger_mobile/helpers/DateTimeHelper.dart';
import 'package:knowe_personnelledger_mobile/helpers/StringHelper.dart';
import 'package:knowe_personnelledger_mobile/models/IModel.dart';
class WorkControlPlanModel implements IModel {
String id;
String name;
String companyId;
String projectId;
String description;
DateTime created;
DateTime updated;
WorkControlPlanModel({this.id, this.name, this.description, this.created, this.updated, this.companyId, this.projectId});
factory WorkControlPlanModel.fromJson(Map<String, dynamic> json) {
return WorkControlPlanModel(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()
};
WorkControlPlanModel clone() {
return new WorkControlPlanModel(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:knowe_personnelledger_mobile/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 嗎?
問題
似乎我無法對類型 T 設置實現約束,只能擴展。 例如 <T implements IModel 不起作用但有效。
這不是問題。 您可以安全地使用<T extends IModel>
,即使對於實現IModel
的類:
abstract class Abstract {}
class Concrete implements Abstract {}
void function<T extends Abstract>(T value) {
print(value);
}
void main() {
function<Concrete>(Concrete()); // works
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.