若是你看API文檔中的數組篇,你會發現類型通常寫成List
泛型是類型安全的(意思是你必須指定數據的類型),可是它的寫法比硬編碼指定類型高效的多:java
若是你想讓數組只有String值,定義爲List
var names = List<String>(); names.addAll(['Seth', 'Kathy', 'Lars']); names.add(42); // Error
另外一個使用泛型是緣由是爲了減小重複代碼。泛型讓你經過一個單一類能夠適配多種類型的數據操做,同時能夠進行靜態代碼檢查(好比,類型安全檢查)。數組
abstract class ObjectCache { Object getByKey(String key); void setByKey(String key, Object value); }
上面代碼是對Object類型操做,在沒用泛型的狀況下,你想對String類型操做,就得從新定義一個類安全
abstract class StringCache { String getByKey(String key); void setByKey(String key, String value); }
後面,你若是相對num類型操做,還得從新定義一個類。編碼
而泛型就能夠解決上面的問題,它經過對類型參數化,實現一個類針對多種數據類型操做的適配。翻譯
abstract class Cache<T> { T getByKey(String key); void setByKey(String key, T value); }
List和map的字面量rest
List和map的字面量方式能夠用指定類型參數。code
var names = <String>['Seth', 'Kathy', 'Lars']; var pages = <String, String>{ 'index.html': 'Homepage', 'robots.txt': 'Hints for web robots', 'humans.txt': 'We are people, not machines' };
var names = List<String>(); names.addAll(['Seth', 'Kathy', 'Lars']); var nameSet = Set<String>.from(names);
下面是map的泛型構造寫法:htm
var views = Map<int, View>();
Dart的泛型類型是在運行時綁定的,這樣,在運行時,能夠知道List內具體類型。
var names = List<String>(); names.addAll(['Seth', 'Kathy', 'Lars']); print(names is List<String>); // true
注意:java中,泛型是採用擦除的方式,它在運行時,其實對象都是Object類型或者泛型的約束父類。
當泛型時,但願限制參數的類型範圍,能夠用extends關鍵字約束。
class Foo<T extends SomeBaseClass> { // Implementation goes here... String toString() => "Instance of 'Foo<$T>'"; } class Extender extends SomeBaseClass {...}
添加約束後,只要是指定的父類或者其子類均可以做爲泛型參數。
var someBaseClassFoo = Foo<SomeBaseClass>(); var extenderFoo = Foo<Extender>();
也能夠不指定泛型參數。
var foo = Foo(); print(foo); // Instance of 'Foo<SomeBaseClass>'
不能夠用限定範圍的泛型參數,這樣靜態代碼檢查器將提示錯誤。
var foo = Foo<Object>();
Initially, Dart’s generic support was limited to classes. A newer syntax, called generic methods, allows type arguments on methods and functions:
T first<T>(List<T> ts) { // Do some initial work or error checking, then... T tmp = ts[0]; // Do some additional checking or processing... return tmp; }
下面是容許使用泛型方法的場景:
In the function’s return type (T).
In the type of an argument (List