flutter 应用场景_【Flutter 1-12】Flutter手把手教程Dart语言——什么是泛型和泛型的使用场景...
泛型
如果你查看數組的API文檔,你會發現數組List的實際類型為List。<> 符號表示數組是一個泛型(或參數化類型)通常使用一個字母來代表類型參數,比如E、T、S、K 和 V 等等。
為什么使用泛型?
泛型常用于需要要求類型安全的情況,但是它對代碼運行也有好處:
適當地指定泛型可以更好地幫助代碼生成。
使用泛型可以減少代碼重復。
比如你想聲明一個只能包含String類型的數組,你可以將該數組聲明為List,這表示只能包含字符串類型的數組。這樣的話就可以很容易避免因為在該數組放入非String類變量而導致的諸多問題,同時編譯器以及其他閱讀代碼的人都可以很容易地發現并定位問題:
var names = List();
names.addAll(['Seth', 'Kathy', 'Lars']);
names.add(42); // 這樣寫就會報錯
另一個使用泛型的原因是可以減少重復代碼。泛型可以讓你在多個不同類型實現之間共享同一個接口聲明,比如下面的例子中聲明了一個類用于緩存對象的接口:
/// 定義一個 抽象類
abstract class ObjectCache {
Object getByKey(String key);
void setByKey(String key, Object value);
}
不久后你可能又會想專門為String類對象做一個緩存,于是又有了專門為String做緩存的類:
/// 另外一個抽象類
abstract class StringCache {
String getByKey(String key);
void setByKey(String key, String value);
}
如果過段時間你又想為數字類型也創建一個類,那么就會有很多諸如此類的代碼。
這時候可以考慮使用泛型來聲明一個類,讓不同類型的緩存實現該類做出不同的具體實現即可:
abstract class Cache {
T getByKey(String key);
void setByKey(String key, T value);
}
在上述代碼中,T是一個替代類型。其相當于類型占位符,在開發者調用該接口的時候會指定具體類型。
使用集合字面量
List、Set以及Map字面量也可以是參數化的。定義參數化的List只需在中括號前添加;定義參數化的Map只需要在大括號前添加 :
var names = ['小蕓', '小芳', '小民'];
var uniqueNames = {'小蕓', '小芳', '小民'};
var pages = {
'index.html': '主頁',
'robots.txt': '網頁機器人提示',
'humans.txt': '我們是人類,不是機器'
};
使用類型參數化的構造函數
在調用構造方法時也可以使用泛型,只需在類名后用尖括號<...>將一個或多個類型包裹即可:
var nameSet = Set.from(names);
下面代碼創建了一個鍵為Int類型,值為View類型的Map對象:
var views = Map();
泛型集合以及它們所包含的類型
Dart的泛型類型是固化的,這意味著即便在運行時也會保持類型信息:
var names = List();
names.addAll(['小蕓', '小芳', '小民']);
print(names is List); // true
限制參數化類型
有時使用泛型的時候可能會想限制泛型的類型范圍,這時候可以使用extends關鍵字:
class Foo {
// 具體實現……
String toString() => "'Foo' 的實例";
}
class Extender extends SomeBaseClass {...}
這時候就可以使用SomeBaseClass或者它的子類來作為泛型參數:
var someBaseClassFoo = Foo();
var extenderFoo = Foo();
這時候也可以指定無參數的泛型,這時無參數泛型的類型則為 Foo:
var foo = Foo();
print(foo); // 'Foo' 的例
將非SomeBaseClass的類型作為泛型參數則會導致編譯錯誤:
/// 這樣寫是會報錯的
var foo = Foo();
使用泛型方法
起初Dart只支持在類的聲明時指定泛型,現在同樣也可以在方法上使用泛型,稱之為泛型方法:
T first(List ts) {
// 處理一些初始化工作或錯誤檢測……
T tmp = ts[0];
// 處理一些額外的檢查……
return tmp;
}
方法 first 的泛型T可以在如下地方使用:
函數的返回值類型 T。
參數的類型 List。
局部變量的類型 T tmp。
總結
以上是生活随笔為你收集整理的flutter 应用场景_【Flutter 1-12】Flutter手把手教程Dart语言——什么是泛型和泛型的使用场景...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: roast和roasting区别_《吐槽
- 下一篇: docker omv 防火墙_OpenM