有的时候我们一个容器只有一个类型或几个类型并不能满足我们的要求,比如set中存放的元素类型都是同一种,map也就指定的两种

这里我们可以将键进行参数化,而不是将容器参数化,也就是我们可以给容器传一个键的类型,然后value用来放对应的实例,这样就可以存放多个不同的类型了

如:

  1. package cn.xf.cp.ch02.item29;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5.  
  6. public class ManyTypeClass
  7. {
  8. //一个存放数据的容器,由于键值类型是不确定的,那么值类型就只能是object类型
  9. private Map<Class<?>, Object> data = new HashMap<Class<?>, Object>();
  10.  
  11. public <T> void putData(Class<T> type, T instance)
  12. {
  13. //吧数据放入进去
  14. if(type != null)
  15. {
  16. //这里需要进行一下类型转换,通过Class的cast方法,因为泛型是基于擦除的,如果不进行验证的话,那么插入的数据到底是不是真的type类型就无法确定的了
  17. data.put(type, type.cast(instance));
  18. }
  19. }
  20.  
  21. public <T> T getDate(Class<T> type)
  22. {
  23. //取出数据,由于数据存放进去是object类型的,那么取出来的时候就需要进行一次类型转换
  24. return type.cast(data.get(type));
  25. }
  26.  
  27. public static void main(String[] args)
  28. {
  29. ManyTypeClass mtc = new ManyTypeClass();
  30. mtc.putData(String.class, "cutter_point");
  31. mtc.putData(Integer.class, 0xcab145de);
  32. mtc.putData(Class.class, ManyTypeClass.class);
  33. mtc.putData(ManyTypeClass.class, mtc);
  34.  
  35. String dataString = mtc.getDate(String.class);
  36. int dataInteger = mtc.getDate(Integer.class);
  37. Class<?> dataClass = mtc.getDate(Class.class);
  38. ManyTypeClass mtc1 = mtc.getDate(ManyTypeClass.class);
  39.  
  40. System.out.printf("%s %x %s %s%n", dataString,
  41. dataInteger, dataClass.getName(), mtc1.getDate(String.class));
  42. }
  43. }

运行显示结果:

异构成功,这个类可以存放各种不同的类型,但是注意不要放List<String>类型或List<Integer>类型,因为首先List<String>.class是不合法的,然后就算放个List进去,如果里面存放的不同的数据,key是List的,结果里面放的是List<Integer>类型,得到的结果并不能满意,也即是不能用在不可具体化的类型中。可以保存String或String[]但是如果是List<String>类型就无法编译了

【Effective Java】8、优先考虑类型安全的异构容器的更多相关文章

  1. Effective Java 第三版——33. 优先考虑类型安全的异构容器

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

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

    当你的泛型集合需要更多的灵活性,你可以将键进行参数化而不是将容器进行参数化.然后将参数化的键提交给容器,来插入或者获取值.用泛型系统来确保值得类型与它的键相符. 我们创建一个Favorite类来模拟这 ...

  3. Item 29 优先考虑类型安全的异构容器

    集合API展示了泛型的一般用法.但是它们(Set,HashMap,Map)限制了每个容器只能有固定数目的类型参数.     比如Set集合,HashMap集合: import java.util.Ha ...

  4. JSON 序列化与反序列化(二)使用TypeReference 构建类型安全的异构容器

    1. 泛型通常用于集合,如Set和Map等.这样的用法也就限制了每个容器只能有固定数目的类型参数,一般来说,这也确实是我们想要的. 然而有的时候我们需要更多的灵活性,如数据库可以用任意多的Column ...

  5. Effective Java通俗理解(持续更新)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  6. 《Effective Java(中文第二版)》【PDF】下载

    <Effective Java(中文第二版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382186 Java(中文第二版)& ...

  7. Effective Java通俗理解(上)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  8. Java 高效编程(Effective Java)中文第三版(补档)

    来源:sjsdfg/effective-java-3rd-chinese <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过, ...

  9. Effective java笔记(四),泛型

    泛型为集合提供了编译时类型检查. 23.不要在代码中使用原生态类型 声明中具有一个或多个类型参数的类或接口统称为泛型.List<E>是一个参数化类,表示元素类型为E的列表.为了提供兼容性, ...

随机推荐

  1. Atitit mtp ptp rndis midi协议的不同区别

    Atitit mtp ptp rndis midi协议的不同区别 1. PTP:1 2. MTP:1 3. Mtp 与usb区别2 4. 不过和UMS相比,MTP也有不足之处:3 5.  MTP协议介 ...

  2. 每天一个linux命令(19):find 命令概览

    Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...

  3. Jasmine入门(上)

    什么是Jasmine Jasmine是一个Javascript的BDD(Behavior-Driven Development)测试框架,不依赖任何其他框架. 如何使用Jasmine 从Github上 ...

  4. gulp/grunt和browserify/webpack的区别

    Gulp应该和Grunt比较,他们的区别我就不说了,说说用处吧.Gulp / Grunt 是一种工具,能够优化前端工作流程.比如自动刷新页面.combo.压缩css.js.编译less等等.简单来说, ...

  5. 通过bootstrap来学习less

    很早之前就听说过less了,但是一直拖着没去学习.最近抽空看了less,其实语法很简单,看一遍基本就知道怎么用了.平时自己写页面用less的话,感觉是方便了些,但是难道less的好处就只是这样? 刚好 ...

  6. MySQL(一) 数据表数据库的基本操作

    序言 这类文章,记录我看<MySQL5.6从零开始学>这本书的过程,将自己觉得重要的东西记录一下,并有可能帮助到你们,在写的博文前几篇度会非常基础,只要动手敲,跟着我写的例子全部实现一遍, ...

  7. .NET程序集强命名删除与再签名技术 源代码剖析

    如果你想去除一个程序集的强签名(strong name),目前为止可以有两个途径 1  反编译为IL代码,删除签名部分,再编译为程序集 2  应用Re-Sign程序,直接对一个程序集再签名 生成和读取 ...

  8. 网站CSS写在html里面的好处

    这是应付超大流量的一种优化方案.为提高速度,他们的外部连接文件一般都存储在单独的服务器上,例如img.****.com,如果这个服务器挂掉 ,整个首页就挂掉了.放在页面内,比较安全.用户访问页面时,不 ...

  9. Update: ELCImagePickerController

    March 3rd, 2011 Posted by: Matt Tuzzolo - posted under:Articles » Featured I recently spent some tim ...

  10. 【原创】Newlife.XCode的常见功能使用(一)查询与数据初始化

            本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html Newlife XCode组件相关文章目录:http://www ...