【Effective Java】8、优先考虑类型安全的异构容器
有的时候我们一个容器只有一个类型或几个类型并不能满足我们的要求,比如set中存放的元素类型都是同一种,map也就指定的两种
这里我们可以将键进行参数化,而不是将容器参数化,也就是我们可以给容器传一个键的类型,然后value用来放对应的实例,这样就可以存放多个不同的类型了
如:
package cn.xf.cp.ch02.item29; import java.util.HashMap;
import java.util.Map; public class ManyTypeClass
{
//一个存放数据的容器,由于键值类型是不确定的,那么值类型就只能是object类型
private Map<Class<?>, Object> data = new HashMap<Class<?>, Object>(); public <T> void putData(Class<T> type, T instance)
{
//吧数据放入进去
if(type != null)
{
//这里需要进行一下类型转换,通过Class的cast方法,因为泛型是基于擦除的,如果不进行验证的话,那么插入的数据到底是不是真的type类型就无法确定的了
data.put(type, type.cast(instance));
}
} public <T> T getDate(Class<T> type)
{
//取出数据,由于数据存放进去是object类型的,那么取出来的时候就需要进行一次类型转换
return type.cast(data.get(type));
} public static void main(String[] args)
{
ManyTypeClass mtc = new ManyTypeClass();
mtc.putData(String.class, "cutter_point");
mtc.putData(Integer.class, 0xcab145de);
mtc.putData(Class.class, ManyTypeClass.class);
mtc.putData(ManyTypeClass.class, mtc); String dataString = mtc.getDate(String.class);
int dataInteger = mtc.getDate(Integer.class);
Class<?> dataClass = mtc.getDate(Class.class);
ManyTypeClass mtc1 = mtc.getDate(ManyTypeClass.class); System.out.printf("%s %x %s %s%n", dataString,
dataInteger, dataClass.getName(), mtc1.getDate(String.class));
}
}
运行显示结果:

异构成功,这个类可以存放各种不同的类型,但是注意不要放List<String>类型或List<Integer>类型,因为首先List<String>.class是不合法的,然后就算放个List进去,如果里面存放的不同的数据,key是List的,结果里面放的是List<Integer>类型,得到的结果并不能满意,也即是不能用在不可具体化的类型中。可以保存String或String[]但是如果是List<String>类型就无法编译了
【Effective Java】8、优先考虑类型安全的异构容器的更多相关文章
- Effective Java 第三版——33. 优先考虑类型安全的异构容器
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- EffectiveJava(29)优先考虑类型安全的异构容器
当你的泛型集合需要更多的灵活性,你可以将键进行参数化而不是将容器进行参数化.然后将参数化的键提交给容器,来插入或者获取值.用泛型系统来确保值得类型与它的键相符. 我们创建一个Favorite类来模拟这 ...
- Item 29 优先考虑类型安全的异构容器
集合API展示了泛型的一般用法.但是它们(Set,HashMap,Map)限制了每个容器只能有固定数目的类型参数. 比如Set集合,HashMap集合: import java.util.Ha ...
- JSON 序列化与反序列化(二)使用TypeReference 构建类型安全的异构容器
1. 泛型通常用于集合,如Set和Map等.这样的用法也就限制了每个容器只能有固定数目的类型参数,一般来说,这也确实是我们想要的. 然而有的时候我们需要更多的灵活性,如数据库可以用任意多的Column ...
- Effective Java通俗理解(持续更新)
这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...
- 《Effective Java(中文第二版)》【PDF】下载
<Effective Java(中文第二版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382186 Java(中文第二版)& ...
- Effective Java通俗理解(上)
这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...
- Java 高效编程(Effective Java)中文第三版(补档)
来源:sjsdfg/effective-java-3rd-chinese <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过, ...
- Effective java笔记(四),泛型
泛型为集合提供了编译时类型检查. 23.不要在代码中使用原生态类型 声明中具有一个或多个类型参数的类或接口统称为泛型.List<E>是一个参数化类,表示元素类型为E的列表.为了提供兼容性, ...
随机推荐
- javascript_basic_02之数据类型、分支结构
1.弱类型:声明无需指定数据类型,由值决定,查看变量数据类型:typeof(变量): 2.隐式转换:任何数据类型与string类型相加,结果为string类型: 3.显式(强制)转换: ①toStri ...
- Java集合-5. (List)已知有一个Worker 类如下: 完成下面的要求 1) 创建一个List,在List 中增加三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 3000 li4 25 3500 wang5 22 3200 2) 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资3300 3) 删除wang5 的信息 4) 利用for 循
第六题 5. (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private do ...
- chrome开发总结(交互/权限/存储)-爬虫
chrome开发总结(交互/权限/存储)-爬虫 [TOC] 标签(空格分隔): 杂乱之地 经过一翻折腾.还是选择了chrome来做爬虫.主要是为了解决一些ajax加载的问题以及代理的问题. 1.chr ...
- LLBL Gen Pro 4.2 Lite 免费的对象关系映射开发框架与工具
LLBL Gen Pro是一款优秀的对象关系映射开发框架,自2003年发布以来,一直有广泛的客户群.LLBL Gen Pro有几个标志性的版本,2.5/2.6是一个很稳定的版本,公司的一些旧的项目仍然 ...
- JavaScript使用正则表达
正则表达式概述 在前面已经涉及了一些正则表达式的用法,现在将系统地学习正则表达式的语法和用途.正则表达式主要用于进行字符串的模式匹配,例如判断一个字符串是否符合指定格式等.例如在windows下搜索文 ...
- 使用余弦定理制作磁盘形状h5音乐播放器
目录 [1]功能实现 [2]效果展示 [3]原理说明 旋转原理 余弦定理 [4]代码实现 HTML CSS JS [5]源码查看 功能实现 [1]歌曲播放进度转换成视觉的旋转角度 [2]点击磁盘任意位 ...
- Android线程之并发处理
上一篇为大家介绍了关于Looper的简单知识,本篇我们介绍一下多线程的并发处理,我们知道Handler通过sendMessage()发送的消息,首先发送给了Looper,存入Looper的消息栈,之后 ...
- 《Administrator's Guide》之Managing Memory
Automatic Memory Management 1. 如果要启动Automatic Memory Management,如何确定MEMORY_TARGET的值呢? 1> 在SQL*Plu ...
- Ext.grid.CheckboxSelectionModel状态设置
直接上代码: var model = grid.getSelectionModel(); model.selectAll();//选择所有行 model.selectFirstRow();//选择第一 ...
- C#中的new修饰符
MSDN:在用作声明修饰符时,new 关键字可以显式隐藏从基类继承的成员. 隐藏继承的成员时,该成员的派生版本将替换基类版本. 虽然可以不使用 new 修饰符来隐藏成员,但将收到编译器警告. 如果使用 ...