Проверка того, какой тип передается в универсальный метод - PullRequest
0 голосов
/ 05 мая 2018

Как проверить, какой тип передается в качестве параметра типа для универсального метода?

foo<T>() {
   // What type is T?
   // I want to able to do something like,
   // if T is String do something, if T is int do something else.
}

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Это зависит от , почему вы хотите проверить тип. Если вы хотите использовать специальные встроенные типы, такие как int и String, вы можете использовать T == int или T == String.

Для более сложных типов, таких как List<int>, я бы рекомендовал не использовать ==, потому что он соответствует только точному типу и может пропустить подтипы, такие как UnmodifiableList<int>, которые вы хотите обработать таким же образом (или рискует нарушить заменяемость подтипов) ). Нет прямого способа сравнить два типа как подтипы, но вы можете использовать вспомогательную функцию, например:

/// Checks whether [T1] is a (not necessarily proper) subtype of [T2].
bool isSubtype<T1, T2>() => <T1>[] is List<T2>;
0 голосов
/ 05 мая 2018

Вы можете использовать оператор равенства (==) в последних версиях Dart SDK:

foo<T>() {
  if (T == String) {

  } else if (T == int) {

  }
}

Единственное, что не тривиально, это проверить общие типы, однако:

foo<T>() {
  // Invalid syntax.
  if (T == List<String>) {}
}

В этом случае вам понадобятся более специализированные методы:

fooOfT<T>(List<T> list) {
  if (T == String) {

  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...