Dart: Как проверить, является ли переменная типом String

У меня есть этот код. Класс является универсальным, и когда я создаю его экземпляр, передавая тип String. Переменная становится строковым типом. Однако заявление

if (_val is String){
}

не похоже на правду. Любая идея, почему?

Это полный код:

    class foo<T>{
    T _val;
    QVar()
    {
         //Read the value from preferences
         if (_val is String){
            ... //Does not come in here!!
         }
    }
  }

 a   = new foo<String>();

Вероятно, вам следует использовать if (_val is String) вместо if (T is String). Большинство компиляторов выдают предупреждения/ошибки при чтении чего-то вроде T is a type but is being used as a value. После этого компилятор будет определять тип _val как String только внутри блока if.

ethane 22.01.2019 06:40

Спасибо что подметил это. Также есть идеи, как я могу сделать явное приведение в дартс?

MistyD 22.01.2019 06:41

не уверен, как использовать .cast в этом случае

MistyD 22.01.2019 06:42

Оператор as. dartlang.org/guides/language/language-tour#type-test-operato‌​rs

ethane 22.01.2019 06:42
18
4
31 491
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вместо

if (T is String)

должен быть

if (_val is String)

Оператор is используется в качестве защиты типа во время выполнения, которая работает с идентификаторами (переменными). В этих случаях компиляторы, по большей части, скажут вам что-то вроде T refers to a type but is being used as a value.

Обратите внимание: поскольку у вас есть защита типа (например, if (_val is String)), компилятор уже знает, что тип _val может быть только String внутри вашего блока if.

Если вам нужно явное приведение, вы можете взглянуть на оператор as в Dart, https://www.dartlang.org/guides/language/language-tour#type-test-operators.

Я сделал `if (_val is String)`, но похоже, что он не входит в условный оператор. я обновил свой код

MistyD 22.01.2019 07:24

Это связано с тем, что _val никогда не инициализируется. Помните, что Strings являются ссылочными типами и будут null, если не будут инициализированы. Это означает, что null является особым типом, и ваше утверждение if будет ложным. Попробуйте инициализировать _val. Взгляните на этот gist.github.com/ethanae/f23f883e1ce2394ce078ddba5db4a8d1

ethane 22.01.2019 07:45

Ах хорошо. Позвольте мне попробовать инициализировать его. Вот я тоже подумал

MistyD 22.01.2019 07:46

Придирка: компилятор не будет повышать тип _val до String здесь, потому что _val не является локальной переменной.

lrn 22.01.2019 09:16

Используйте .runtimeType, чтобы получить тип:

void main() {

var data_types = ["string", 123, 12.031, [], {} ];`
  
for(var i=0; i<data_types.length; i++){

    print(data_types[i].runtimeType);

    if (data_types[i].runtimeType == String){
      print("-it's a String");

    }else if (data_types[i].runtimeType == int){
      print("-it's a Int");
      
    }else if (data_types[i].runtimeType == [].runtimeType){
      print("-it's a List/Array");

    }else if (data_types[i].runtimeType == {}.runtimeType){
      print("-it's a Map/Object/Dict");

    }else {
      print("\n>> See this type is not their .\n");
    } 
}}

Люблю это спасибо

Dohan Smit 04.12.2021 07:09

Другие вопросы по теме