Dart之旅08: 范型

如果你查閱List類的API文檔耐量,你會看見類型的寫法是List<E>這里的E就是范型昭雌,它指代這個類型的實(shí)例是某種類型相關(guān)的撞叽。

為什么使用范型蝇率?

范型通常用來保證類型安全,并且他還有更多的好處是你的代碼運(yùn)行:

  • 正確指定泛型類型會產(chǎn)生更好的代碼峡扩。
  • 您可以使用泛型來減少代碼重復(fù)踱蠢。

使用范型可以讓工具檢測出更多書寫錯誤:

var names = List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
names.add(42); // Error

另一個使用原因是可以減少代碼重復(fù)汁汗,比如你想實(shí)現(xiàn)一個對象緩存:

abstract class ObjectCache {
  Object getByKey(String key);
  void setByKey(String key, Object value);
}

你會發(fā)現(xiàn)你經(jīng)常能用到字符串緩存撮抓,或者Int緩存妇斤,所以你又照著原有代碼定義了個StringCache或者IntCache之類的:

abstract class StringCache {
  String getByKey(String key);
  void setByKey(String key, String value);
}

后來你又想定義各種類型的緩存,但建立那么多的類丹拯,還都是重復(fù)的站超。你自己都覺得煩。這時你需要用范型來處理這種問題:

abstract class Cache<T> {
  T getByKey(String key);
  void setByKey(String key, T value);
}

這里T只是一個占位符咽笼,當(dāng)你真正聲明Cache對象的時候需要指明T所指代的類型顷编。

使用集合字面量

集合字面量期望你添加明確的范型:

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'
};

使用范型構(gòu)造函數(shù)

var names = List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
var nameSet = Set<String>.from(names);

或者非命名構(gòu)造函數(shù):

var views = Map<int, View>();

范型集合和它們包含的類型

Dart中的范型是具體化的戚炫,這意味著你可以在運(yùn)行時獲取范型的類型剑刑,例如你可以測試集合的類型:

var names = List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
print(names is List<String>); // true

注意這里和Java完全相反,Java的范型是可擦除的,你可以判斷這個類型是否是List施掏,而不能判斷這個類型是否是List<String>

范型限制

和Java類似钮惠,限制范型的范圍的方式可以使用extends關(guān)鍵字:

class Foo<T extends SomeBaseClass> {
  // Implementation goes here...
  String toString() => "Instance of 'Foo<$T>'";
}

class Extender extends SomeBaseClass {...}

這時你就只可以使用SomeBaseClass類型或者它的子類當(dāng)作范型了:

var someBaseClassFoo = Foo<SomeBaseClass>();
var extenderFoo = Foo<Extender>();

這時你可以指定沒有范型的Foo,它的范型默認(rèn)是SomeBaseClass:

var foo = Foo();
print(foo); // Instance of 'Foo<SomeBaseClass>'

你不可以指定非SomeBaseClass的子類七芭,下面的代碼不能通過編譯:

var foo = Foo<Object>();

使用范型方法

起初素挽,Dart的范型只能使用類級別的范型,后來可以在方法上定義方法級別的范型了狸驳。

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;
}

類似Java的范型方法预明,這里定義T時需要在方法名之后定義一個新的范型變量。它有三種用途:

  • 當(dāng)作方法返回值
  • 當(dāng)作參數(shù)
  • 在方法內(nèi)部使用

更多信息參考使用范型方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耙箍,一起剝皮案震驚了整個濱河市撰糠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辩昆,老刑警劉巖阅酪,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汁针,居然都是意外死亡术辐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門施无,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辉词,“玉大人,你說我怎么就攤上這事猾骡〗嫌欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵卓练,是天一觀的道長隘蝎。 經(jīng)常有香客問我,道長襟企,這世上最難降的妖魔是什么嘱么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮顽悼,結(jié)果婚禮上曼振,老公的妹妹穿的比我還像新娘。我一直安慰自己蔚龙,他們只是感情好冰评,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著木羹,像睡著了一般甲雅。 火紅的嫁衣襯著肌膚如雪解孙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天抛人,我揣著相機(jī)與錄音弛姜,去河邊找鬼。 笑死妖枚,一個胖子當(dāng)著我的面吹牛廷臼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绝页,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼荠商,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了续誉?” 一聲冷哼從身側(cè)響起结啼,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屈芜,沒想到半個月后郊愧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡井佑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年属铁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躬翁。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡焦蘑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盒发,到底是詐尸還是另有隱情例嘱,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布宁舰,位于F島的核電站拼卵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蛮艰。R本人自食惡果不足惜腋腮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壤蚜。 院中可真熱鬧即寡,春花似錦、人聲如沸袜刷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽著蟹。三九已至墩蔓,卻和暖如春梢莽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钢拧。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炕横,地道東北人源内。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像份殿,于是被迫代替她去往敵國和親膜钓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,101評論 1 32
  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 3,665評論 0 7
  • 1. 簡介 1.1 什么是 MyBatis 卿嘲? MyBatis 是支持定制化 SQL颂斜、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,520評論 0 4
  • 回答這個問題,突然語塞:2016年拾枣,好像沒有讀書拔执? 其實(shí)是想不起來了梅肤。 為了工作司蔬,讀了很多相關(guān)領(lǐng)域的書:化學(xué)專業(yè)...
    杰出小卡閱讀 187評論 0 0
  • 故事該怎么算起? 是從盛夏姨蝴,還是從暖冬俊啼? 畢竟他們一起走過了好多好多的春秋冬夏。 歲月太長左医,所幸還記得—— 透過玻...
    yifans夏術(shù)閱讀 222評論 0 0