有没有办法检测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
类型。dynamic
和Object
之间的区别仅在编译时存在,在编译时,您可以在静态类型为dynamic
的值上调用任何方法,而在静态类型为Object
的值上调用的方法不是很多。差异会影响编译,但是在编译之后,您可以对类型执行的操作仅限于检查对象是否是该类型的实例(所有对象都是Object
和dynamic
的实例),或者类型是否是子对象。另一个类型(Object
和dynamic
具有相同的子类型和父类(super class)型,并且彼此是子类型和父类(super class)型,它们完全等同于子类型)。
您测试if (T is dynamic)
是没有意义的,它将T
转换为表示类型的Type
对象,并且该类型object是一个对象,并且所有对象都是is
的实例(对dynamic
进行检查)。
您可以尝试if (new Object() is T)
,仅当T是“top type”时才成功,其中包括dynamic
,Object
和void
。
或者,您也可以尝试使用if (T == dynamic)
,它应该给出相同的结果(如果没有,则是我们将解决的错误-因为Object == dynamic
应该为true)。
总而言之,您不应该尝试在Dart 2中检测dynamic
,因为它在运行时实际上并不特殊。
您无法检查用户是否传递了类型参数,因为类型参数是可选的,并且如果用户不添加一个,则将根据类型变量的边界(此处为dynamic
/ Object
)的边界来提供一个。
关于dart - 在Dart中检测动态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51208022/