Typedef函数中的泛型

时间:2019-01-27 09:19:53

标签: generics dart

我正在编写一个树实用程序,需要能够传递一些匿名函数。我喜欢在可能的地方进行强类型化,并且我知道可以通过使用动力学来实现。

我要创建的typedef将返回models键和parentKey,以便树处理程序可以从平面集合中生成树。

这是我拥有的伪代码:

typedef KeySelector<T> = dynamic Function<T>(T item);


/// The handler for tree structures
class TreeHandler<T> {
  /// The items in a flattened structure
  final List<T> items;

  /// Selector function for an items key
  final KeySelector<T> keySelector;

  /// Selector function for an items parent key
  final KeySelector<T> parentKeySelector;

  /// The actual tree the items
  /// are converted into
  List<TreeNode<T>> tree;

  TreeHandler(this.items, this.keySelector, this.parentKeySelector);
}

使用此实用程序的类具有以下初始化代码:

class MyModel {
  MyModel({this.id, this.parentId});

  int id;
  int parentId;
}

_treeHandler = TreeHandler<MyModel>(
      null,
      <MyModel>(MyModel m) => m.id,
      <MyModel>(MyModel m) => m.parentId,
    );

在这里,我收到错误消息:“ [dart]未为类Object定义吸气剂ID”。

我尝试了不同类型的方法来正确初始化TreeHandler,但似乎无法正确完成它。

例如,此初始化有效,但不再强类型输入:

_treeHandler = TreeHandler<MyModel>(
   null,
   <MyModel>(dynamic m) => m.id,
   <MyModel>(dynamic m) => m.parentId,
);

我可能正在滥用框架,但我确实希望通过使用泛型来实现这一目标。

1 个答案:

答案 0 :(得分:2)

这对我有用

typedef KeySelector<T> = dynamic Function(T item);

class TreeNode<T> {}

/// The handler for tree structures
class TreeHandler<T> {
  /// The items in a flattened structure
  final List<T> items;

  /// Selector function for an items key
  final KeySelector<T> keySelector;

  /// Selector function for an items parent key
  final KeySelector<T> parentKeySelector;

  /// The actual tree the items
  /// are converted into
  List<TreeNode<T>> tree;

  TreeHandler(this.items, this.keySelector, this.parentKeySelector);
}

class MyModel {
  MyModel({this.id, this.parentId});

  int id;
  int parentId;
}

void main() {
  var _treeHandler = TreeHandler<MyModel>(
    null,
    (MyModel m) => m.id,
    (MyModel m) => m.parentId,
  );
}

我认为主要的问题是您有2个具有相同名称的通用参数,其中一个隐藏了另一个

typedef KeySelector<T> = dynamic Function<T>(T item);

这是泛型函数的泛型typedef,其中KeySelector<T>为typedef引入泛型参数T,而Function<T>为泛型函数引入泛型参数T

更改为

typedef KeySelector<T> = dynamic Function(T item);

解决了这个问题。