我正在寻找一种方法来比较Dart中的两种类型,并在它们相同时获得True
。
我有个方法:
SomeItemType exampleMethod<SomeItemType>(Map<String, dynamic> value) {
if (SomeItemType.toString() == 'BuiltMap<String, String>') {
return BuiltMap<String, String>.from(value) as SomeItemType;
}
// (...)
}
我必须检查类型参数SomeItemType
是否实际上等于类型BuiltMap<String, String>
。到目前为止,我找到的唯一方法是上面的字符串比较,在我看来,这并不太优雅。
我尝试过以下解决方案,但它们对我不起作用:
SomeItemType is BuiltMap<String, String>
// returns False
SomeItemType == BuiltMap<String, String>
// error: The operator '<' isn't defined for the type 'Type'.
BuiltMap<String, String> is SomeItemType
// error: The operator '<' isn't defined for the type 'Type'.
2条答案
按热度按时间1tuwyuhd1#
你需要检测一个 *type变量 * 是否持有一个与某个已知类型“相同”的类型。
我可能不会在检查中使用 equality,我只会检查变量类型是否是已知类型的子类型。
你可以这样做:
如果你想检查类型相等性,那么你必须决定类型相等性意味着什么。最简单的是“相互子类型化”,这将意味着:
这将接受例如
isMutualSubtypes<void, dynamic>()
,因为这两种类型都是顶级类型。检查类型 identity 要困难得多,因为语言本身没有这个概念。如果类型是相互的子类型,它们在运行时被认为是等价的(我们静态地区分
void
和dynamic
,但不是在运行时)。你可以 try 如下所示:但是
Type
对象的相等性是非常不明确的,不能保证比相互子类型化更好地工作。因为不同的类型可能具有相同的名称。
2vuwiymt2#
我需要检查一个变量是否指向一个函数。