代码之家  ›  专栏  ›  技术社区  ›  Preem Palver2

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

  •  1
  • Preem Palver2  · 技术社区  · 3 年前

    我有一个通用函数。我正在尝试返回基于类型的值 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();
        }
      }
    
    2 回复  |  直到 3 年前
        1
  •  2
  •   Rahul    3 年前

    的类类型 T 实际上是 Type 。它的值是ClockData。

    is 检查运行时类型,并且T的运行时类型为 类型 因此T不是时钟数据。

    正如@fsw提到的,==是更好的方法。

        2
  •  1
  •   fsw    3 年前

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

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

    请不要这样检查标识,并且将不支持子类型。如果您需要支持类型继承(传递的子类 时钟数据 像 T )你可以使用这样的技巧:

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