泛型-泛型方法_泛型类_泛型接口
泛型-泛型方法/泛型类/泛型接口
泛型-泛型方法_泛型类_泛型接口
泛型-泛型方法/泛型类/泛型接口
泛型方法
解决 类 接口方法的复用性、以及对不特定数据类型的支持(类型校验)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
T getData<T>(T value) {
return value;
}
void main() {
print(getData(123)); // 123
print(getData('xxx')); // xxx
var str = getData<String>('hello');
print(str); // hello
var num = getData<int>(123);
print(num); // 23
}
泛型类
以下代码只能实现增加 int 类型的数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyList {
List list = <int>[];
void add(int value) {
this.list.add(value);
}
List getList() {
return list;
}
}
void main() {
// new 关键字可以省略
MyList l = new MyList();
l.add(1);
l.add(2);
print(l.getList()); // [1, 2]
}
可以增加任意类型的数据 - 但是每次调用增加的类型要统一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MyList<T> {
List list = <T>[];
void add(T value) {
this.list.add(value);
}
List getList() {
return list;
}
}
void main() {
// new 关键字可以省略
MyList l = MyList();
l.add(1);
l.add('张三');
l.add(true);
print(l.getList()); // [1, 张三, true]
}
实例话泛型类的时候 指定传入类型:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MyList<T> {
List list = <T>[];
void add(T value) {
this.list.add(value);
}
List getList() {
return list;
}
}
void main() {
// 指定传入类型
MyList l = MyList<String>();
// 报错
// l.add(1);
l.add('张三');
print(l.getList()); // [张三]
}
泛型接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
abstract class ObjectCache {
getByKey(String key);
void setByKey(String key, Object value);
}
abstract class StringCache {
getByKey(String key);
void setByKey(String key, String value);
}
// 优化后
abstract class Cache<T> {
getByKey(String key);
void setByKey(String key, T value);
}
实现数据缓存功能:有文件缓存、内存缓存;内存缓存和文件缓存按照接口约束实现。
- 定义一个泛型接口约束实现它的子类必须有getByKey(key) 和 setByKey(key, value)
- 要求setByKey时候的value的类型和实例话子类的时候指定的类型一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
abstract class Cache<T> {
getByKey(String key);
void setByKey(String key, T value);
}
class FileCache<T> implements Cache{
@override
getByKey(String key) {
}
@override
void setByKey(String key, T value) {
print('我是文件缓存 数据:key=${key} value=${value}');
}
}
class MemoryCache<T> implements Cache{
@override
getByKey(String key) {
}
@override
void setByKey(String key, T value) {
print('我是内存缓存 数据:key=${key} value=${value}');
}
}
void main() {
MemoryCache m = new MemoryCache<String>();
m.setByKey('key1', 'hello');
}
本文由作者按照 CC BY 4.0 进行授权