【问题标题】:Comparing two types in Dart比较 Dart 中的两种类型
【发布时间】:2020-08-09 15:51:58
【问题描述】:

我正在寻找一种方法来比较 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&lt;String, String&gt; 类型。 到目前为止我发现的唯一方法是上面的字符串比较,我认为这不太优雅。

我尝试了以下解决方案,但它们对我不起作用:

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'.

【问题讨论】:

  • 您能否为您的示例添加更多详细信息?如果不知道您如何调用exampleMethod,就不可能知道问题。

标签: dart


【解决方案1】:

您需要检测一个类型变量是否拥有与某个已知类型“相同”的类型。

我可能不会在那个检查中选择 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&lt;void, dynamic&gt;(),因为这两种类型都是顶级类型。

类型 identity 更难检查,因为语言本身没有这个概念。如果类型是相互的子类型,则它们在运行时被认为是等价的(我们静态区分 voiddynamic,但在运行时不区分)。 您可以尝试类似:

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

但是Type 对象的相等性是非常未指定的,并且不能保证比相互子类型化更好。 绝对不要使用字符串比较:

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

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

【讨论】:

  • "You need to detect whether a type variable holds a type which is "the same" as some known type." 这正是我所需要的。谢谢你的回答!
猜你喜欢
  • 1970-01-01
  • 2023-01-13
  • 2018-04-24
  • 1970-01-01
  • 2018-04-17
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多