Dart:如何检查变量类型是否为字符串

35

我有这段代码。这个类是通用的,当我通过传递一个字符串类型来实例化它时,变量会变成字符串类型。然而,这个语句

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是一种类型,但正在被用作值”。此后,编译器将推断_val的类型仅在if块内为String - ethane
谢谢你指出这一点。还有,你知道我如何在Dart中进行显式转换吗? - MistyD
不确定在这种情况下如何使用.cast。 - MistyD
1
as 运算符。https://www.dartlang.org/guides/language/language-tour#type-test-operators - ethane
2个回答

58

不是使用

if(T is String)

应该是这样的

if(_val is String)
is运算符用于运行时对标识符(变量)进行类型保护。在这些情况下,大多数编译器会告诉您类似于“T指的是一种类型,但正在被用作值”的信息。
请注意,因为您有一个类型保护(即if(_val is String)),编译器已经知道_val的类型只能在您的if块内是String
如果需要显式转换,可以查看Dart中的as运算符,链接:https://www.dartlang.org/guides/language/language-tour#type-test-operators

我已经写了 if(_val is String),但似乎它没有进入条件语句。我更新了我的代码。 - MistyD
这是因为_val从未被初始化。记住,Strings是引用类型,如果不初始化,将为null。这意味着null是一个特殊类型,你的if语句将为false。尝试初始化_val。请查看此链接:https://gist.github.com/ethanae/f23f883e1ce2394ce078ddba5db4a8d1 - ethane
啊,好的。让我试着初始化它。这也是我想的。 - MistyD
小问题:编译器不会将 _val 强制转换为 String,因为 _val 不是本地变量。 - lrn

9

使用.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接