10天学会flutter DAY5 玩转泛型


abstract class ObjectCache {

  Object getByKey(String key);

  void setByKey(String key, Object value);

}



不久后你可能又会想专门为 String 类对象做一个缓存,于是又有了专门为 String 做缓存的类:


abstract class StringCache {

  String getByKey(String key);

  void setByKey(String key, String value);

}



如果过段时间你又想为数字类型也创建一个类,那么就会有很多诸如此类的代码……

这时候可以考虑使用泛型来声明一个类,让不同类型的缓存实现该类做出不同的具体实现即可:


abstract class Cache<T> {

  T getByKey(String key);

  void setByKey(String key, T value);

}



在上述代码中,T 是一个替代类型。其相当于类型占位符,在开发者调用该接口的时候会指定具体类型。

2、使用集合字面量


List、Set 以及 Map 字面量也可以是参数化的。定义参数化的 List 只需在中括号前添加 <type>;定义参数化的 Map

只需要在大括号前添加 <keyType, valueType>


var names = <String>['Seth', 'Kathy', 'Lars'];

var uniqueNames = <String>{'Seth', 'Kathy', 'Lars'};

var pages = <String, String>{

  'index.html': 'Homepage',

  'robots.txt': 'Hints for web robots',

  'humans.txt': 'We are people, not machines'

};



3、使用类型参数化的构造函数


在调用构造方法时也可以使用泛型,只需在类名后用尖括号(<…>)将一个或多个类型包裹即可:


var nameSet = Set<String>.from(names);



下面代码创建了一个键为 Int 类型,值为 View 类型的 Map 对象:


var views = Map<int, View>();



4、泛型集合以及它们所包含的类型


Dart的泛型类型是 固化的,这意味着即便在运行时也会保持类型信息:


var names = <String>[];

names.addAll(['Seth', 'Kathy', 'Lars']);

print(names is List<String>); // true



与 Java 不同的是,Java 中的泛型是类型 擦除 的,这意味着泛型类型会在运行时被移除。在 Java 中你可以判断对象是否为 List

但不可以判断对象是否为 List。

5、限制参数化类型


有时使用泛型的时候,你可能会想限制可作为参数的泛型范围,也就是参数必须是指定类型的子类,这时候可以使用 extends 关键字。

  • 一种常见的非空类型处理方式,是将子类限制继承 Object (而不是默认的 Object?)。

class Foo<T extends Object> {

  // Any type provided to Foo for T must be non-nullable.

}



  • 除了Object,你还可以对其他类型使用extends。下面是一个扩展SomeBaseClass的例子,这样SomeBaseClass的成员可以被T类型的对象调用:

class Foo<T extends SomeBaseClass> {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值