【问题标题】:How to enforce Implements constraint on generic type T in generic Dart method?如何在泛型 Dart 方法中对泛型类型 T 实施实施约束?
【发布时间】: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 吗?

【问题讨论】:

    标签: flutter generics dart


    【解决方案1】:

    问题

    似乎我无法对类型 T 设置实现约束,只能设置扩展。例如

    这不是问题。您可以安全地使用&lt;T extends IModel&gt;,即使对于实现 IModel 的类:

    abstract class Abstract {}
    
    class Concrete implements Abstract {}
    
    void function<T extends Abstract>(T value) {
      print(value);
    }
    
    void main() {
      function<Concrete>(Concrete()); // works
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-09
      • 2017-01-21
      • 1970-01-01
      • 2021-11-06
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多