优先考虑类型安全的异构容器(29)

1、泛型常用于集合(Set、Map)以及单元素容器(ThreadLocal、AtomicReference)

  • 被参数化的容器:只能有固定数目的类型参数

2、Class 类在jdk 1.5 之后被泛型化了

  • String.class 属于Class<String> 类
  • 下述,追求更加灵活:将key 参数化,不是整个容器

9ca30092f1ffd6003e478c23fe2cae551e3.jpg

  • Favorites 就是类型安全的异构容器
  • 通配符类型是嵌套的,Class<?> 在存入map 时被Class<String>等替换掉,因此可以存储
  • map的value 是Object ,因此与key 的类型不能保证匹配
  • getFavorite 方法,使用 T 做返回类型,需要类型动态转换,保证了key 与 value 的联系
  • 这里的 cast 仅仅验证参数是否是class对象所表示类型的实例(如果结果不对,抛出ClassCastException)

29357d0a6ee5513371b21e37af850cff49c.jpg

Favorites 类存在两种局限性

  • 其一:恶意的客户端可以很容易破坏类型安全,只要以原生态形式使用class对象(擦除的原因)
  • put 的时候加一个强制转换即可

535592db41acc91a8dd6cecec6141fbaeae.jpg

  • 其二,不能用在不可具体化类型中
  • 不可以保存 List<String>  ,因为List<String>.class不合法(合法的是:List.class)
  • 如下,类 Class 提供了一种安全执行类型转换方法asSubClass 转换成子类

0dbaa5ff4d28ec685f18fd6d68ffb4b8057.jpg

转载于:https://my.oschina.net/u/3847203/blog/1832137

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值