天天看點

Dart學習筆記(五)——泛型

泛型方法

現在有這樣一個需求,定義一個方法,要求傳入什麼資料就傳回什麼資料。我們可以這樣寫:

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

複制

如果我們想讓該方法有類型校驗的話,可以這樣寫:

Dart學習筆記(五)——泛型

我們看到,<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);
    }
  }
}           

複制

使用如下:

Dart學習筆記(五)——泛型

該例中,第二行代碼被擋住了,如下:

var printObject = new PrintClass<String>();           

複制

這時,給addObject方法傳的參數就限制為String類型,如果傳了其他類型的參數,那麼就會在運作的時候報錯。

泛型接口

前文我們提到,在Dart中,一般通過抽象類來定義接口。

是以泛型接口的定義完全可以參考泛型類的定義。

再次總結一下,泛型不但可以解決代碼重用的問題,還可以對不确定類型進行類型校驗。