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