日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

flutter 应用场景_【Flutter 1-12】Flutter手把手教程Dart语言——什么是泛型和泛型的使用场景...

發布時間:2025/3/20 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语言——什么是泛型和泛型的使用场景...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。