我有一个泛型函数.我正在try 返回一个基于类型T的值, 然而,我的函数似乎从未匹配过任何类型(请参见下面的代码):

int _getCollection<T>() {
    print(T); // the actual type
    print(T is ClockData); // ClockData is a class I created

    // always returns false when passing _getCollection<ClockData>()
    if (T is ClockData) { 
      return 1;
    } else if (T is UserData) {
      return 2;
    } else {
      throw Exception();
    }
  }

推荐答案

is运算符将判断左操作数是否为右操作数的实例.%t是类型参数,而不是ClockData的实例.您可以使用==运算符来比较这些运算符:

int _getCollection<T>() {
  if (T == ClockData) { 
    return 1;
  } else if (T == UserData) {
    return 2;
  } else {
    throw Exception();
  }
}

请不要这样判断身份,并且不支持子类型.如果需要支持类型继承(将ClockData的子类作为T传递),可以使用如下技巧:

int _getCollection<T>() {
  if (<T>[] is List<ClockData>) {
    return 1;
  } else if (<T>[] is List<UserData>) {
    return 2;
  } else {
    throw Exception();
  }
}

Dart相关问答推荐

Dart/Flutter ffi(外部函数接口)本机回调,例如:sqlite3_exec

如何在flutter中使用rootBundle加载图片?

为什么Dart中的 abs() 函数在没有用括号括起来时返回负数?

StreamBuilder 会在无状态小部件中自动关闭流吗?

`pub get` 将 pubspec 依赖项下载到哪里?

Dart/Flutter 如何在 map 中初始化列表?

Flutter ToggleButton 类 - Flutter 1.9.1

从real mobile浏览器访问Flatter localhost

如何在Dart中测试流

如何提取dart/Flutter视频元数据

将Flutter的 PageView 与屏幕左侧对齐

在小部件上显示对话框

向 javascript 公开 Dart 函数

Dart - 将自纪元以来的毫秒数(UNIX 时间戳)转换为人类可读的时间

如何在 Dart 中获取字符串的字节数?

有 Javascript 到 Dart 的转换器吗?

从 Dart 应用访问 pubspec.yaml 属性

Dart 中的函数重载

Dart 中的错误与异常

何时在 Dart 中使用 part/part of 与 import/export?