dart - 在Dart中检测动态类型

标签 dart

有没有办法检测Dart中的dynamic类型?

我有以下方法:

Stream<T> on<T>() {
  if (T is dynamic) { // <-- Is always true
    // Return the dynamic Stream.
  } else {
    // Return the Stream that was cast to Stream<T>.
  }
}

我想找出用户是否使用类型参数调用了on方法。因此,我想区分对myClass.on()myClass<MyType>.on()的调用。

在Dart 2及更高版本中有可能吗?

最佳答案

在Dart 2(由于具有通用方法)中,由于没有区别,因此无法在运行时区分dynamic类型和Object类型。
dynamicObject之间的区别仅在编译时存在,在编译时,您可以在静态类型为dynamic的值上调用任何方法,而在静态类型为Object的值上调用的方法不是很多。差异会影响编译,但是在编译之后,您可以对类型执行的操作仅限于检查对象是否是该类型的实例(所有对象都是Objectdynamic的实例),或者类型是否是子对象。另一个类型(Objectdynamic具有相同的子类型和父类(super class)型,并且彼此是子类型和父类(super class)型,它们完全等同于子类型)。

您测试if (T is dynamic)是没有意义的,它将T转换为表示类型的Type对象,并且该类型object是一个对象,并且所有对象都是is的实例(对dynamic进行检查)。

您可以尝试if (new Object() is T),仅当T是“top type”时才成功,其中包括dynamicObjectvoid
或者,您也可以尝试使用if (T == dynamic),它应该给出相同的结果(如果没有,则是我们将解决的错误-因为Object == dynamic应该为true)。

总而言之,您不应该尝试在Dart 2中检测dynamic,因为它在运行时实际上并不特殊。

您无法检查用户是否传递了类型参数,因为类型参数是可选的,并且如果用户不添加一个,则将根据类型变量的边界(此处为dynamic / Object)的边界来提供一个。

关于dart - 在Dart中检测动态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51208022/

相关文章:

json - 如何获取JSON数据索引中的所有可用JSON数据

flutter - Flutter中的 strip 是否可能同时具有 'expand'和 'contract'效果?

android-studio - Android 工具链 - 为 Android 设备开发(Android SDK 版本 29.0.2)

flutter - 使用GlobalKey触发另一个状态功能

text - 文本小部件数据未居中

firebase - 检查用户是否登录 Flutter & firebase auth |

list - Flutter - 如何查询列表中的搜索项

flutter - 为什么我无法引用对象的另一个键中的一个键?

sorting - 在Dart-Second Level中对 map 列表进行排序

dart - TabBar中的TabBarView占用剩余空间