我需要做运行时类型检查。
void main() {
final type = [Map<String, String>, bool];
final mapTest = {"A": "B"};
if (type.contains(mapTest.runtimeType)) {
print("yes");
} else {
print("no, ${mapTest.runtimeType} is not in $type");
}
bool boobool = true;
if (type.contains(boobool.runtimeType)) {
print("yes, ${boobool.runtimeType} is in $type");
} else {
print("no, ${mapTest.runtimeType} is not in $type");
}
}
mapTest
应该通过测试,但它没有,出了什么问题?
no, _Map<String, String> is not in {Map<String, String>, bool}
yes, bool is in {Map<String, String>, bool}
4条答案
按热度按时间fnvucqvd1#
Map<K, V>
是一个 abstract 类型,任何对象都不可能有Map<K, V>
的runtimeType
;任何对象都是某个“具体”类型的示例。Type
对象通常仅对于完全相同的Type
是相等的;它不检查一个X1 M5 N1 X是否表示另一个的子类型。因此,
mapTest.runtimeType
不可能与Map<K, V>
相等。您也将无法使用
is
;mapTest is type[0]
是不法律的的,因为is
要求右操作数是静态已知的。在这种情况下,您最多可以检查静态类型而不是运行时类型:
其打印:
也就是说,无论您最终想对它做什么都可能是非常值得怀疑的,依赖特定的
Type
值通常不是一个好主意,因为正如前面提到的,子类型不会被自动处理。jfgube3f2#
这是因为
mapTest's
运行时类型是_InternalLinkedHashMap<String, String>
,与Map<String, String>
不同,所以类型检查失败。要通过类型检查,可以考虑显式地将
mapTest
转换为Map<String,String
。ujv3wf0j3#
Dart使用类
Map
继承的_Map
的构造函数创建Map
,您在type
中直接提到了Map<String, String>
的类型。因此,我建议您采用在变量
type
中创建runtimeType
的方法。3okqufwl4#
答案很多但我找到了最简单的解决办法。
变更
final type = [Map<String, String>, bool];
到
final type = [Map<String, String>().runtimeType, bool];
似乎达到了目的
yes, _Map<String, String> is in [_Map<String, String>, bool, List<String>]