先看一个List和Map的例子:
void main(){
//使用泛型,很多的容器对象,在创建对象时都可以定义泛型类型,跟java一样
var list = List<String>();
list.add('aaa');
list.add('bbb');
list.add('ccc');
print(list);
var map = Map<int, String>();
map[1] = 'aaaa';
map[2] = 'bbbb';
map[3] = 'cccc';
print(map);
}
打印:
[aaa, bbb, ccc]
{1: aaaa, 2: bbbb, 3: cccc}
1 泛型-泛型函数
void main(){
var key = addCache('hongxue', 'xiaoming');
print(key);
}
//泛型函数
K addCache<K, V>(K key, V value) {
K temp = key;
print('${key}: ${value}');
return temp;
}
打印:
hongxue: xiaoming
hongxue
2 泛型-构造函数泛型
void main(){
//构造函数泛型
var p = Phone<String>('123456');
print(p.mobileNumber);
}
//构造函数泛型
class Phone<T> {
final T mobileNumber;
Phone(this.mobileNumber);
}
打印:
123456
3 泛型-泛型限制
void main(){
//泛型限制, 通过 extends 关键字限定可泛型使用的类型
var footMassage = FootMassage();
var m = Massage<FootMassage>(footMassage);
m.massage.doMassage();
}
//泛型限制
class Massage<T extends FootMassage > {
final T massage;
Massage(this.massage);
}
class FootMassage {
void doMassage() {
print('脚底');
}
}
打印:
脚底
4 泛型-与java区别
- Java中的泛型信息是编译时的,泛型信息在运行时是不存在的
- Dart的泛型类型是固化的,在运行时也有可以判断的具体类型
void main(){
var names = List<String>();
print(names is List<String>);//true
print(names.runtimeType); // List<String>
}
打印:
true
List<String>