dart系列之:dart類中的泛型

flydean發表於2021-11-17

簡介

熟悉JAVA的朋友可能知道,JAVA在8中引入了泛型的概念。什麼是泛型呢?泛型就是一種通用的型別格式,一般用在集合中,用來指定該集合中應該儲存的物件格式。

有了泛型可以簡化我們的程式設計,並且可以減少錯誤的產生,非常的方便。

dart語言中也有泛型。一起來看看吧。

為什麼要用泛型

使用泛型的主要目的是保證型別安全,比如我們有一個List,然後只希望List中儲存String型別,那麼在dart中可以這樣指定:

var stringList = <String>[];
stringList.addAll(['jack ma', 'tony ma']);
stringList.add(18); // 報錯

那麼在使用的過程中,只能向stringList中新增字串,如果向其新增數字,則會報錯,從而保證List中型別的一致性。

巧妙的使用泛型還能夠減少我們的程式碼量,因為泛型可以代表一類通用的型別。

比如,在學校中,我們有寢室,寢室是有男女之分的,那麼對應男生來說有這樣的定義:

abstract class BoyRoom {
    Boy getByName(String name);
}

對於女生來說有這樣的定義:

abstract class GirlRoom{
    Girl getByname(String name);
}

事實上,兩者本質上沒太大區別,只是引數或者返回值的型別發生了變化,那麼我們可以這樣寫:

abstract class Room<T>{
    T getByname(String name);
}

從而簡化了程式碼的使用。

怎麼使用泛型

泛型一般使用大寫的單個字元來表示,通常來說是E, T, S, K 和 V等。

泛型最常見的使用地方是集合中,比如List, set 和 map中:

var listExample = <String>['jack ma', 'tony ma'];
var setExamples = <String>{'jack ma', 'tony ma'};
var mapExamples = <String, String>{
  'name1': 'jack ma',
  'name2': 'tony ma',
};

泛型還可以用在這些集合類的建構函式中,如下:

var stringMap = Map<String, String>();

表示構造出來的集合中,應該包含對應的型別。

型別擦除

雖然JAVA中也有泛型,但是JAVA中的泛型有一個型別擦除的特點。什麼時候型別擦除呢?型別擦除就是指泛型指定的型別,只在編譯的時候生效,而在執行時是沒有泛型的概念的。

對於一個List<String> 來說,JAVA在執行時,只能判斷物件是不是List,而不能判斷物件是不是List<String>。

dart就和java不一樣了,dart在執行時能夠攜帶型別資訊,也就是說,在dart中可以判斷一個物件是不是List<String>。

var stringList = <String>[];
stringList.addAll(['jack ma', 'tony ma']);
print(names is List<String>); // true

泛型的繼承

使用泛型的目的是限制引數的型別,所以我們通常會指定泛型的父類,以限制泛型的型別範圍:

class Room<T extends Student> {

}

class Boy extends Student {...}

在使用的過程中,可以傳入Student本身,也可以傳入Student的子類Boy,還可以不傳:

var student = Room<Student>();
var boy = Room<Boy>();
var studentDefault = Room();

泛型方法

dart中的泛型除了可以用在class中以外,還可以用在方法中:

T doSomething<T>(List<T> list) {
  T result = list[0];
  return result;
}

方法中指定的泛型可以用在返回型別、引數和方法中的本地變數型別中。

總結

以上就是dart中泛型和其使用的介紹。

本文已收錄於 http://www.flydean.com/08-dart-generics/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!

相關文章