如何在 Dart 中为容器 class 指定数据类型

How to specify a data type for a container class in Dart

我正在寻找 dart 语法来实现以下但不知道搜索答案的正确术语是什么。

class BaseClass <T extends MyType> {

  List<T> items;

  T getFirstItem() => items.first;
}

然后可以像这样子class

class ClassForMyType<MyType> extends BaseClass {
   List<MyType> items;

   MyType getFirstItem() => items.first;
}

ClassForMyType 将扩展 BaseClass,这样我就不必重新实现人为的 getFirstItem() 方法。

实际上我希望能够像这样使用它:

ClassForMyType container = ClassForMyType();
MyType item = Mytype();
container.items.add(item);
List<MyType> itemsFromContainer = container.items;
MyType firstItem = container.getFirstItem();

我试过这样的方法:


BaseClass<T extends MyType> {
  List<T> items;
  void addItemFromMap(Map map) {
    items.add(T.fromMap(map));
  }
}

上述方法在 MyType 中确实存在的 .fromMap() 上失败。在我访问 MyType 上的其他方法的其他方法中,这些方法似乎有效,但似乎只有命名的构造函数才有问题。

我认为唯一可行且看起来相对不错的方法是:


abstract class BaseClass<T extends MyType> {
  List<T> items;

  // abstract factory method
  T itemFromMap(Map map);
  
  void addItemFromMap(Map map) {
    items.add(itemFromMap(map));
  }

}

class ClassForMyType extends BaseClass<MyType> {
  
  // implementing abstract factory method, delegating call to constructor
  MyType itemFromMap(Map map) => MyType.fromMap(map);

}

我同意,你应该在每个子类中实现工厂方法有点开销,但这是唯一正确的方法。