generics - Dart,不能调用Generic的方法

标签 generics dart flutter generic-programming

我正在尝试创建一个抽象数据模型,我在其中传递数据并键入 a 然后返回列表,但是当我无法调用 T.fromJson() 方法时,请注意传递类型有方法 fromJson()

class DataList<T> {
  final bool success; 
  dynamic data;


  InfosResponse({
    this.success,
    List<dynamic> data,   
  }) {
    castDataToList(data);
  }

  factory DataList.fromJson(Map<String, dynamic> json) {
    return DataList(
      success: json['success'],
      data: json['data'],
    );
  }

  void castDataToList(jsonData) {
    this.data = List<T>.from(jsonData.map((x) => T.fromJson(x)));
  }
}

最佳答案

您不能对类型变量调用静态方法。静态方法必须在编译时已知,而类型变量的值直到运行时才知道。

您可以使用您要调用的方法参数化您的类:

class DataList<T> {
  final bool success; 
  dynamic data;
  T Function(Object) fromJson;

  DataList({
    this.success,
    List<dynamic> data,   
    this.fromJson;
  }) : data = castDataToList(data);

  factory DataList.fromJson(Map<String, dynamic> json, T fromJson(Object o)) {
    return DataList(
        success: json['success'],
        data: json['data'],
        fromJson: fromJson,
    );
  }

  List<T> castDataToList(jsonData) =>
      [for (var x in jsonData) fromJson(x)];
}

当你想使用一个类型为 Foo 的类时,它有一个 fromJson 静态方法或构造函数,你可以将实例创建为:

var dataList = DataList<Foo>.fromJson(someJsonMap, Foo.fromJson);

这会将 Foo.fromJson 函数传递给类,然后类可以在需要时使用它。

关于generics - Dart,不能调用Generic的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53369276/

相关文章:

java - 泛型和赋值问题

java 模板形式参数与 Void

c# - 将具有反射/Cast 属性的泛型属性映射到泛型类型

android - 为移动应用程序集成 Rust + Flutter + Kotlin

flutter - 如何在Android Studio IDE中自定义硬换行竖线用于代码格式化

flutter - 如何在 onDragCompleted 上从 Draggable 获取位置?

loops - 遍历对象数组

c# - 数组的通用扩展方法无法编译

flutter - 将原始字符串转换为字符串

flutter - Flutter中如何使用RSSI对蓝牙设备进行排序