Dart:检查泛型函数的类型T

qybjjes1  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(120)

我有一个通用函数。我试图返回一个基于类型T的值,但是,我的函数似乎从来没有匹配任何类型(见下面的代码):

int _getCollection<T>() {
    print(T); // the actual type
    print(T is ClockData); // ClockData is a class I created

    // always returns false when passing _getCollection<ClockData>()
    if (T is ClockData) { 
      return 1;
    } else if (T is UserData) {
      return 2;
    } else {
      throw Exception();
    }
  }

字符串

yeotifhr

yeotifhr1#

is操作符将检查左操作数是否是右操作数的示例。T是类型参数,而不是ClockData的示例。你可以使用==运算符来比较:

int _getCollection<T>() {
  if (T == ClockData) { 
    return 1;
  } else if (T == UserData) {
    return 2;
  } else {
    throw Exception();
  }
}

字符串
请不要检查身份,并且不支持子类型。如果你需要支持类型继承(将ClockData的子类作为T传递),你可以使用这样的技巧:

int _getCollection<T>() {
  if (<T>[] is List<ClockData>) {
    return 1;
  } else if (<T>[] is List<UserData>) {
    return 2;
  } else {
    throw Exception();
  }
}

wooyq4lh

wooyq4lh2#

T的类类型实际上是Type。它的值是ClockData。
is检查Runtimetype,T的运行时类型为Type。所以T不是ClockData。
正如@fsw提到的,==是更好的方法。

相关问题