2013-01-16 101 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