我想知道是否可以在DART中创建泛型类型的实例.在其他语言(如Java)中,您可以使用反射解决此问题,但我不确定这在DART中是否可行.

我有一节课:

class GenericController <T extends RequestHandler> {

    void processRequest() {
        T t = new T();  // ERROR
    }
}

推荐答案

您可以使用类似的代码:

import "dart:mirrors";

void main() {
  var controller = new GenericController<Foo>();
  controller.processRequest();
}

class GenericController<T extends RequestHandler> {
  void processRequest() {
    //T t = new T();
    T t = Activator.createInstance(T);
    t.tellAboutHimself();
  }
}

class Foo extends RequestHandler {
  void tellAboutHimself() {
    print("Hello, I am 'Foo'");
  }
}

abstract class RequestHandler {
  void tellAboutHimself();
}

class Activator {
  static createInstance(Type type, [Symbol constructor, List
      arguments, Map<Symbol, dynamic> namedArguments]) {
    if (type == null) {
      throw new ArgumentError("type: $type");
    }

    if (constructor == null) {
      constructor = const Symbol("");
    }

    if (arguments == null) {
      arguments = const [];
    }

    var typeMirror = reflectType(type);
    if (typeMirror is ClassMirror) {
      return typeMirror.newInstance(constructor, arguments, 
        namedArguments).reflectee;
    } else {
      throw new ArgumentError("Cannot create the instance of the type '$type'.");
    }
  }
}

Dart相关问答推荐

Flutter drawArc() 方法绘制完整的圆而不仅仅是圆弧

Flutter | Dart:URI的目标不存在

dart:js 和 js 包有什么区别?

ProcessException:进程C:\..\myapp\android\gradlew.bat异常退出:

Flutter - 为什么滑块不会在 AlertDialog 中更新?

如何在 Flutter 中找出 URL 的有效性?

如何在 Flutter/dart 中获取一周中特定日期的日期?

每次我按下导航项时,底部的导航栏都会重新加载所有小部件

在小部件构建期间,如何在Flutter中导航?

错误:无法将参数类型void Function(ImageInfo, bool)分配给参数类型ImageStreamListener

Flatter BLoC-如何将参数传递给事件?

如何使用工厂构造函数扩展抽象类?

Dart 交互/访问数据库

找到两个数字中larger/smaller的方法是什么

如何将条目添加到列表中的特定索引?

Dart:将map转换为查询字符串

在 Dart 中,你能不能从一个构造函数中调用另一个构造函数

在 Dart 和 Pub 中,我应该将 pubspec.lock 添加到我的 .gitignore 吗?

如何在 Dart 中使用 Switch Case 语句

有没有办法在 Dart 中通过引用传递原始参数?