2013-01-16 67 views
1

为什么这段代码没有引发错误?飞镖混淆参数化列表

List<String> x; 

void main() { 
    x = [1,23,3,423,2]; 
    print(x); 
} 

很抱歉的新手问题,但我刚开始学习镖,我问这个,因为我的理解是,x只能包含的String清单,并应抛出一个异常,由于值不是列表的String,但列表num。这是一个错误,或?

回答

4

这是可选的键入操作。

var x; // same as List<String> x 
List<String> y; 

main() { 
    x = [1,2,3,4]; 
    y = x; // valid 
    x = y; // valid 
    print(x); // [1,2,3,4] 
    print(y); // [1,2,3,4] 
} 

无论您指定List<String>var,你的代码将执行相同。工具使用类型注释(List<String>)来验证您的代码。

在达特朗网站上阅读的好文章是关于optional types的文章。

编辑:其实,这也是一个关于列表的有趣点。如果您使用文字列表初始化列表(例如,[]),那么你实际上是在创建一个List(),如:

main() { 
    var x = new List(); 
    var y = []; 
    print(x is List); // true 
    print(y is List); // true 
} 

但是,如果你想使用泛型类型化的列表,你必须使用构造函数的语法如:

main() { 
    var x = new List<String>(); 
    print(x is List); // true 
    print(x is List<String>); // true 
    print(x is List<num>); // false 
} 
+5

只是一个另外:你也可以这样写:'无功富= [ '富', '酒吧'];'。 :) –

+0

谢谢 - 我忘记了这个变种! –

0

飞镖类型是可选的不是静态的。所以在运行时,所有类型的annonations基本上被替换为var