У меня есть этот код. Класс является универсальным, и когда я создаю его экземпляр, передавая тип 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>();
Спасибо что подметил это. Также есть идеи, как я могу сделать явное приведение в дартс?
не уверен, как использовать .cast в этом случае
Оператор as
. dartlang.org/guides/language/language-tour#type-test-operators
Вместо
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)`, но похоже, что он не входит в условный оператор. я обновил свой код
Это связано с тем, что _val
никогда не инициализируется. Помните, что Strings
являются ссылочными типами и будут null
, если не будут инициализированы. Это означает, что null
является особым типом, и ваше утверждение if
будет ложным. Попробуйте инициализировать _val
. Взгляните на этот gist.github.com/ethanae/f23f883e1ce2394ce078ddba5db4a8d1
Ах хорошо. Позвольте мне попробовать инициализировать его. Вот я тоже подумал
Придирка: компилятор не будет повышать тип _val
до String
здесь, потому что _val
не является локальной переменной.
Используйте .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");
}
}}
Люблю это спасибо
Вероятно, вам следует использовать
if (_val is String)
вместоif (T is String)
. Большинство компиляторов выдают предупреждения/ошибки при чтении чего-то вродеT is a type but is being used as a value
. После этого компилятор будет определять тип_val
какString
только внутри блокаif
.