泛型方法
現在有這樣一個需求,定義一個方法,要求傳入什麼資料就傳回什麼資料。我們可以這樣寫:
String getData(String value){
return value;
}
複制
上例中是傳入一個字元串,然後傳回該字元串。那麼當我要是傳入一個int類型的資料的時候呢?此時我們可以定義多個方法,如下:
String getData(String value){
return value;
}
int getData1(int value){
return value;
}
List getData2(List value){
return value;
}
複制
也就是說,我們想要傳入什麼類型的 資料,就調用對應的方法。但是這樣的話,代碼就備援了。其實,我們完全可以不指定傳入參數的類型以及傳回的類型,如下:
getData(value){
return value;
}
複制
這樣的話,我們就可以傳入任意類型的資料了,傳入什麼類型的資料,傳回的就是該類型的該資料。但是這樣做還是有一個弊端的,就是不能做類型檢查了。也就是說,我們不能夠限制傳入資料的類型了。那麼在這種情況下,就引出我們今天的主角——泛型了。
下面是我将方法定義成一個泛型方法:
T getData<T>(T value){
return value;
}
複制
T表示一個泛型,也就是任意類型。我們不一定非得使用T來表示泛型,可以使用任意的字母來代替,不過一般是使用T來代表泛型。
然後我們可以像普通方法一樣來使用它:
print(getData(123));
複制
如果我們想讓該方法有類型校驗的話,可以這樣寫:

我們看到,<String>表示傳入的資料類型必須是String,上例中我傳入了int類型的123,是以程式就報錯了。
通過上面的分析,我們可知,泛型方法能解決兩個問題:
1,代碼複用,避免代碼備援;
2,對不确定的資料類型進行類型校驗。
泛型類
實際上,List就是一個泛型類,我們可以給List指定元素的類型。
比如下面這段代碼:
main(){
List mylist = new List();
mylist.add('123Str');
mylist.add(123);
print(mylist);
}
複制
我給mylist添加了兩個元素,一個元素是String類型,一個是int類型。但是一般而言,List中的元素類型要保持一緻,此時就要通過泛型來實作。如下:
List mylist = new List<String>();
複制
此時再給mylist增加元素,元素類型就隻能是String,如果是其他類型就會報錯。
那麼泛型類如果定義呢?接下來給大家示範一下。
首先建立一個普通的類:
class PrintClass{
List dataList = new List();
addObject(value){
this.dataList.add(value);
}
printInfo(){
for (var item in this.dataList) {
print(item);
}
}
}
複制
使用如下:
main(){
var printObject = new PrintClass();
printObject.addObject(1);
printObject.addObject('2str');
printObject.printInfo();
}
複制
此時,如果我想限制PrintClass類的addObject方法傳入資料的類型,那麼就将該類建立成一個泛型類:
class PrintClass<T>{
List dataList = new List<T>();
addObject(T value){
this.dataList.add(value);
}
printInfo(){
for (var item in this.dataList) {
print(item);
}
}
}
複制
使用如下:
該例中,第二行代碼被擋住了,如下:
var printObject = new PrintClass<String>();
複制
這時,給addObject方法傳的參數就限制為String類型,如果傳了其他類型的參數,那麼就會在運作的時候報錯。
泛型接口
前文我們提到,在Dart中,一般通過抽象類來定義接口。
是以泛型接口的定義完全可以參考泛型類的定義。
再次總結一下,泛型不但可以解決代碼重用的問題,還可以對不确定類型進行類型校驗。