Dart中两种类型的比较

5us2dqdw  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(211)

我正在寻找一种方法来比较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'.
1tuwyuhd

1tuwyuhd1#

你需要检测一个 *type变量 * 是否持有一个与某个已知类型“相同”的类型。
我可能不会在检查中使用 equality,我只会检查变量类型是否是已知类型的子类型。
你可以这样做:

class _TypeHelper<T> {}
bool isSubtypeOf<S, T>() => _TypeHelper<S>() is _TypeHelper<T>;
// or just ...           => <S>[] is List<T>;
...
  if (isSubtypeOf<T, BuiltMap<String, String>>()) { ... }

如果你想检查类型相等性,那么你必须决定类型相等性意味着什么。最简单的是“相互子类型化”,这将意味着:

bool isMutualSubtypes<S, T>() => isSubtypeOf<S, T>() && isSubtypeOf<T, S>();
// or                         => isSubtypeOf<S Function(S), T Function(T)>();
// or                         => isSubtypeOf<void Function<X extends T>() Function(),
//                                           void Function<X extends S>() Function()>();

这将接受例如isMutualSubtypes<void, dynamic>(),因为这两种类型都是顶级类型。
检查类型 identity 要困难得多,因为语言本身没有这个概念。如果类型是相互的子类型,它们在运行时被认为是等价的(我们静态地区分voiddynamic,但不是在运行时)。你可以 try 如下所示:

bool isSameType<S, T>() => S == T;

但是Type对象的相等性是非常不明确的,不能保证比相互子类型化更好地工作。

// Don't use!
bool isSameType<S, T>() => "$S" == "$T"; // BAD!

因为不同的类型可能具有相同的名称。

2vuwiymt

2vuwiymt2#

我需要检查一个变量是否指向一个函数。

相关问题