Dart:如何在运行时确定可为空的泛型类型?

2024-01-09

我需要确定是否泛型 is a String, bool, int, double或运行时的另一个类。我没有找到办法做到这一点可空类型:

class Foo<T> {  
  void foo() {
    if (T == int) {
      print("'T' is an int");
    } else {
      print("'T' is not an int");
    }
  }
}

void main() {
  final foo = Foo<int>();
  final bar = Foo<int?>();
  foo.foo();
  bar.foo();
}

控制台输出:

// 'T' is an int
// 'T' is not an int

是否有任何我不知道的语法来检查可为空类型?我已经尝试过int?但它不编译。


这是一个更具体的例子,基于以下方法如何在 Dart NNBD 中检查泛型类型是否可为空? https://stackoverflow.com/q/66240962/.

注意当转换为 JavaScript 时,所有数字都是 IEEE-754 双精度浮点值 https://stackoverflow.com/q/54827376/,所以要区分Dartdouble/double? and int/int?,我们必须首先检查浮点文字,该文字不能是int.

void foo<T>() {
  if (1.5 is T) {
    if (null is T) {
      print('double?');
    } else {
      print('double');
    }
  } else if (1 is T) {
    if (null is T) {
      print('int?');
    } else {
      print('int');
    }
  } else {
    print('something else');
  }
}

void main() {
  foo<int?>();    // Prints: int?
  foo<int>();     // Prints: int
  foo<double?>(); // Prints: double?
  foo<double>();  // Prints: double
  foo<bool>();    // Prints: something else
}

请注意,上述方法不适用于void or Null. Null可以通过检查来处理T == Null, but T == void不是有效的语法(类似于T == int?)。您可以通过将它们作为进行比较的通用函数的类型参数来解决这个问题,因此另一种方法是:

/// Returns true if T1 and T2 are identical types.
///
/// This will be false if one type is a derived type of the other.
bool typesEqual<T1, T2>() => T1 == T2;

void foo<T>() {
  if (typesEqual<T, void>()) {
    print('void');
  } else if (typesEqual<T, Null>()) {
    print('Null');
  } else if (typesEqual<T, int>()) {
    print('int');
  } else if (typesEqual<T, int?>()) {
    print('int?');
  } else if (typesEqual<T, double>()) {
    print('double');
  } else if (typesEqual<T, double?>()) {
    print('double?');
  } else {
    print('something else');
  }
}

void main() {
  foo<int?>();    // Prints: int?
  foo<int>();     // Prints: int
  foo<double?>(); // Prints: double?
  foo<double>();  // Prints: double
  foo<void>();    // Prints: void
  foo<Null>();    // Prints: Null
  foo<bool>();    // Prints: something else
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart:如何在运行时确定可为空的泛型类型? 的相关文章

随机推荐

  • 在 xsd 中定义 xml,其中属性决定可能的内容

    如何在 xsd 中定义这样的东西
  • vim中ctrl-v粘贴时如何输入^M

    我的vim使用ctrl v是粘贴快捷方式 这与需要ctrl v作为快捷方式前缀的命令冲突 例如 M need ctrl v ctrl m 我可以在 vim 命令行中执行此操作 并且无需初始化即可在 vim 中执行此操作 但该符号不会从 vi
  • SQL JOIN 查找没有特定值的匹配记录的记录

    我正在尝试加快几年前为雇主的购买授权应用程序编写的一些代码的速度 基本上我有一个慢子查询 我想用 JOIN 替换它 如果它更快 当主管登录应用程序时 他会看到他尚未授权或拒绝的购买请求列表 该列表是通过以下查询生成的 SELECT FROM
  • numpy 唯一且不排序[重复]

    这个问题在这里已经有答案了 如何使用 numpy unique 而不对结果进行排序 而只是按照它们在序列中出现的顺序进行排序 像这样的东西吗 a 4 2 1 3 1 2 3 4 np unique a 4 2 1 3 而不是 np uniq
  • 使用 OpenCV 查找灰度图像中的局部最大值

    有谁知道如何找到灰度中的局部最大值IPL DEPTH 8U使用 OpenCV 进行图像处理 HarrisCorner 提到了类似的东西 但我实际上对角落不感兴趣 谢谢 如果像素等于 局部 邻域中的最大值 则该像素被视为局部最大值 下面的函数
  • 为什么 ANTLR4 不匹配单词“of”和标点符号“,”?

    我有一个Hello g4带有语法定义的语法文件 definition wordsWithPunctuation words WORD wordsWithPunctuation word word punctuation word word
  • Android M 奇怪的共享首选项问题

    在我运行 Android M 开发者预览版 2 的 Nexus 5 上 卸载 重新安装应用程序时 设备正在检索我很久以前存储的共享首选项 例如布尔值isFirstLaunch 清除这些的唯一方法是从设备设置中手动执行此操作 Android
  • Python 2.7,将utf8字符串转换为ascii

    我正在使用 python 2 7 12 我有一个包含 unicode 文字的字符串 它不是 Unicode 类型 我想将其转换为文本 这个例子解释了我想要做什么 gt gt gt s x00u x00s x00e x00r x00n x00
  • Express res.render 不渲染页面

    我正在尝试从我的主站点获取输入 提交输入后 页面应重定向到 view 看起来它成功重定向到 view 因为console log 正在被触发 但是res render不管用 如果我手动去 view它正在渲染页面 这是我的代码app js f
  • 出现解析错误:语法错误,意外的 T_NEW [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有两个类
  • 在同一个程序中使用 scanf 和 fgets 吗?

    我需要做类似以下的事情 int main void char a b cstring printf please enter something scanf c c a b prinf thanks now some more fgets
  • swift 未转义的控制字符

    我正在尝试从服务器获取 json 并将其反序列化 但我尝试使用未转义的控制字符进行探测 我的代码如下 let urlFinal http 000 0000 000 000 8080 let jsonUrl urlFinal let sess
  • Nuxt 忽略的系统环境变量

    我的 Nuxt 项目使用系统环境变量来设置客户端 ID 秘密 URL 等 一个例子是我的nuxt config js我使用以下公式设置了几个属性 something process env SOMETHING something for d
  • 在另一个应用程序中使用应用程序服务

    我有一个包含服务的 Android 应用程序 现在我想在另一个应用程序中访问该服务 我怎样才能做到这一点 我通过网络找到了这个应用程序 请在下面找到代码片段 1 gt public class LocalWordService extend
  • 如何在 Netbeans 中自动缩进?

    In eclipse you can click Ctrl I at any line and it ll automatically indent the line or group of lines according to the i
  • Play 框架 2.2.1 HTTPs 连接尝试失败

    我正在尝试在开发模式下在 HTTPs 上运行 play 框架 2 2 1 应用程序 我使用以下命令 Development Play ssltest JAVA OPTS Dhttps port 9443 play run 我得到了以下内容
  • Panda 中的“如果未传入 io 的缓冲区或路径,则必须显式设置引擎”

    运行以下 Python Panda 代码时 xl pd ExcelFile dataFileUrl sheets xl sheet names data xl parse sheets 0 colheaders list data 我收到值
  • C++ DWORD 的 C# 等效项是什么?

    经过搜索 我听说 UInt32 是 C DWORD 的 C 等效项 我通过执行算术测试结果 DWORD 1 0x2C C UInt32 1 0x2C C 它们产生完全不同的结果 有人可以告诉我 C 中 DWORD 的正确匹配吗 你的例子正在
  • 触摸移动方法中物理主体大小不随 SKSpriteNode 大小变化而变化

    我正在尝试创建一个弹簧启动器 当触摸在场景上移动时 弹簧将盘绕触摸向下拖动的量 然后在触摸结束方法上启动弹簧上方的项目 为此 我将触摸移动方法中 SKSpriteNode 的大小和位置更改为 launcher position CGPoin
  • Dart:如何在运行时确定可为空的泛型类型?

    我需要确定是否泛型 is a String bool int double或运行时的另一个类 我没有找到办法做到这一点可空类型 class Foo