/**
* Dart之泛型:
* 泛型就是解决类 接口 方法的复用性 以及对不特定数据类型的支持
*/
/**
* 创建一个泛型方法
* 下面这个方法没有指定返回参数 但是可以指定返回值的类型而且指定的返回类型必须要和返回值相对应
*/
T returnGenerics<T>(T value){
return value;
}
/**
* 泛型方法的使用 List就是内置的一个自带泛型的类 可以约定List泛型的属性
*/
List<String> getListData(){
/**
* 切记 方法是带泛型的 创建一个实例的时候 也要指定泛型。 否则会报错 type 'List<dynamic>' is not a subtype of type 'List<String>'
* 当然 如果方法没有指定泛型 你实例的时候可以随便指定泛型;
* 说白了 指定泛型就是为了约束相同类型。
*/
List<String> list = new List();
list.add("1");
list.add("2");
list.add("3");//✅
//那这样就不能传入其他类型
//list.add(1); ❌
//list.add(true);❌
return list;
}
/**
* 泛型接口的使用 和泛型方法差不多 接口上的泛型和接口泛型必须一致
*/
abstract class InterfaceGenerics<T>{
setData(String key,T value);
}
//如果指定了String类型 那么value必须为String类型
class TestInterfaceGenerics implements InterfaceGenerics<String>{
@override
setData(String key, value) {
key = '1';
value = '1';
//这样定义会报错
//value = 1;
}
}
/**
* 泛型类的自定义
* 在类上定义泛型 在实例化类的时候进行属性约定
*
*/
class ListDataClass<T>{
List list = new List();
add(T value){
list.add(value);
}
detail(){
return list.forEach((value)=> print(value));
}
}
void main(){
print('设置返回值为String类型并返回一个String字符串 '+returnGenerics<String>('1'));
print('设置返回值为int类型并返回一个数字 ${returnGenerics<int>(123)}');
getListData().forEach((value)=>print(value));
ListDataClass listDataClass = new ListDataClass<String>();
listDataClass.add("3");
listDataClass.add("2");
listDataClass.add("1");
//这种赋值在编译的时候就会报错
//listDataClass.add(1);
listDataClass.detail();
}