我发现了一些奇怪的行为,试图检查Dart中某些对象的运行时类型。让我们举一个简单的例子:
main(List<String> args) {
List<Map> l1 = new List<Map>();
l1.add(new Map<String, int>());
List<int> l2 = ['Start', 'Stop'];
checkType(l1.runtimeType);
checkType(l1[0].runtimeType);
checkType(l2.runtimeType);
}
checkType(Type type) {
switch(type) {
case List:
print('it is a List!');
break;
case Map:
print('it is a List!');
break;
default:
print('Unmanaged type $type');
break;
}
}
字符串
该程序具有以下输出:
非管理型List<Map>
非管理型_InternalLinkedHashMap<String, int>
非管理型List
第一种情况不能在switch语句中检查,因为如果我尝试设置“List<Map>
“情况,我会得到错误:在常量表达式中,该运算符的操作数必须是'num'类型第二种情况不能匹配,因为在case中使用_InternalLinkedHashMap会得到以下错误:Case expression must be constant。
在最后一个例子中,我将List定义为int(List<int>
)的List,但系统忽略了它,并认为它是一个简单的List。我认为这是误导,这样的声明应该被禁止。
任何帮助/建议?
2条答案
按热度按时间c3frrgcw1#
如果你想根据对象的类型进行流控制,你实际上是想根据对象的类是否实现了 interface,而不是它的运行时类型。这就是Type Test Operators
is
和is!
的作用。请记住,在Dart中,类也是一个接口,因此您可以测试对象是否是特定的类。
字符串
请注意,我们倾向于认为是“类”的东西,如
List
和Map
,不是类,它们是接口。任何返回此类示例的东西(包括构造函数)实际上返回实现接口的类。你可以使用泛型,但要小心。
型
类可以通过显式实现接口、从实现接口的类继承接口或通过混合来实现接口。
型
vc9ivgsu2#
我们必须从对象中获取runtimetype
字符串
检查此答案以供参考https://stackoverflow.com/a/71529798/8192246