1、泛型常用于集合(Set、Map)以及单元素容器(ThreadLocal、AtomicReference)
- 被参数化的容器:只能有固定数目的类型参数
2、Class 类在jdk 1.5 之后被泛型化了
- String.class 属于Class<String> 类
- 下述,追求更加灵活:将key 参数化,不是整个容器
- Favorites 就是类型安全的异构容器
- 通配符类型是嵌套的,Class<?> 在存入map 时被Class<String>等替换掉,因此可以存储
- map的value 是Object ,因此与key 的类型不能保证匹配
- getFavorite 方法,使用 T 做返回类型,需要类型动态转换,保证了key 与 value 的联系
- 这里的 cast 仅仅验证参数是否是class对象所表示类型的实例(如果结果不对,抛出ClassCastException)
Favorites 类存在两种局限性
- 其一:恶意的客户端可以很容易破坏类型安全,只要以原生态形式使用class对象(擦除的原因)
- put 的时候加一个强制转换即可
- 其二,不能用在不可具体化类型中
- 不可以保存 List<String> ,因为List<String>.class不合法(合法的是:List.class)
- 如下,类 Class 提供了一种安全执行类型转换方法asSubClass 转换成子类