个人学习用
不严谨
学习的话请看别的博客
为什么使用泛型
void main(){
/**
* 为什么使用泛型?
* 将编译时期和运行时期的错误,提到了编码时期,提前发现错误,节省修改时间.
* 泛型可以减少代码重复。
*/
}
使用集合字面量
void main() {
/**
* 使用集合字面量
* List、Set 以及 Map 字面量也可以是参数化的。
* 定义参数化的 List 只需在中括号前添加 <type>;
* 定义参数化的 Map 只需要在大括号前添加 <keyType, valueType>:
*/
var names = <String>['张三', '李四', '王五'];
var ages = <String>{'11', '22', '33'};
var pages = <String, int>{'html': 1, 'web': 2, 'haha': 3};
}
使用类型参数化构造函数
void main() {
/**
* 使用类型参数化构造函数
* 在调用构造方法时候也可使用泛型,只需要在类后面加上<泛型种类>,来包裹,再调用构造方法
*/
var names = <String>['张三', '李四', '王五'];
var ages = <int>[1,2,3,4,5];
var p1 = List<int>.from(ages); // [1, 2, 3, 4, 5]
print(p1);
//会报错,names不是int类型的数组
var p = List<int>.from(names); //type 'String' is not a subtype of type 'int'
print(p);
}
/*
class Point {
var i;
Point(this.i);
void show() {
print(i);
}
}
*/
泛型集合以及他们所包含的类型
void main() {
/**
* 泛型集合以及他们所包含的类型
* Dart的 泛型类型是 固定的,在运行时也会保持类型
*/
var names = new List<String>();
names.addAll(['张三', '李四', '王五']);
print(names is List<String>); //true
//与 Java 不同的是,Java 中的泛型是类型 擦除 的,这意味着泛型类型会在运行时被移除。
//在 Java 中可以判断对象是否为 List
//但不可以判断对象是否为 List<String>。
}
限制参数化类型 extends
void main() {
/**
* 限制参数化类型
* extends 关键字
* T extends Num
*/
var t = Test<Son>();
var t1 = Test<Father>();
t.show(); //false false
t1.show(); //false false
}
class Father {}
class Son extends Father {}
//限制传入的泛型T 为 Father类的子类或者是Father类
class Test<T extends Father> {
T t;
void show() {
print(t is Father);
print(t is Son);
}
}
使用泛型方法
void main() {
/**
* 泛型方法
* 使用部位:
* 返回值 T
* 参数类型 List<T>
* 局部变量 T t;
*/
T getFirstListIndex<T>(List<T> list) {
T t = list[0];
return t;
}
List<String> list = ['张三', '李四', '王五'];
print(getFirstListIndex(list)); //张三
}