P360

Thinking in java的这几章艰涩难懂, 主要是结合展示了一些Class结合模板的示例, 实际运用中很少会用到

package com.cnsuning.src;import java.util.*;public class Main {public static void main(String[] args) {String[] RobotTypes = { "com.cnsuning.src.Robot","com.cnsuning.src.T100", "com.cnsuning.src.DolaAMen" };List<Class<? extends Robot>> list = new ArrayList<Class<? extends Robot>>();try {for (String type : RobotTypes) {list.add((Class<? extends Robot>) Class.forName(type));}} catch (ClassNotFoundException e) {// TODO Auto-generated catch blockthrow new RuntimeException(e);}RobotMaker rm = new RobotMaker();rm.setRobotTypes(list);List<Robot> robotList = rm.makeRobots(10);HashMap<String,Integer> robotCounter = RobotCounter.countRobotList(robotList);System.out.println(robotList);System.out.println(robotCounter);}
}class Robot {public String toString() {return "I'm robot";}
}class T100 extends Robot {public String toString() {return "I'm T100";}
}class DolaAMen extends Robot {public String toString() {return "I'm DolaAMen";}
}class RobotMaker {private Random rand = new Random(47);private List<Class<? extends Robot>> robotTypes;public void setRobotTypes(List<Class<? extends Robot>> robotTypes) {this.robotTypes = robotTypes;}public List<Robot> makeRobots(int num) {List<Robot> robots = new ArrayList<Robot>();for (int i = 0; i < num; i++) {robots.add(getRandomType());}return robots;}private Robot getRandomType() {int n = rand.nextInt(robotTypes.size());try {return robotTypes.get(n).newInstance();} catch (InstantiationException | IllegalAccessException e) {// TODO Auto-generated catch blockthrow new RuntimeException(e);}}
}class RobotCounter {private static class Counter extends HashMap<String, Integer> {public void count(String type) {Integer num = get(type);if (null == num) {put(type, 1);} else {put(type, num + 1);}}}public static HashMap<String,Integer> countRobotList(List<Robot> robots) {Counter RobotCounter = new Counter();for (Robot robot : robots) {if (robot instanceof T100){RobotCounter.count("T100");}else if (robot instanceof DolaAMen){RobotCounter.count("DolaAMen");}else if(robot instanceof Robot){RobotCounter.count("Robot");}}return RobotCounter;}
}

对书中代码稍作简化编写了以上测试代码, 结果为:

[I'm DolaAMen, I'm DolaAMen, I'm T100, I'm DolaAMen, I'm T100, I'm DolaAMen, I'm T100, I'm DolaAMen, I'm robot, I'm T100]
{Robot=1, T100=4, DolaAMen=5}

比较奇特的是类似List<? extends Robot> list = new ArrayList<? extends Robot>();的写法会报编译错误, 而List<Class<? extends Robot>>就不会, 继承向的模板限定只能用于Class???

此外, 统计随机生成类型数目利用了instance of 的类型检查以及内部类, 使用内部类可以很容易地特异化整合已有的容器类等, 实现特定功能.

利用Class的动态类型判断可以避免使用大量if else 请参见 点击打开链接

14.3 类型转换前先做检查相关推荐

  1. 记住看小电影前一定要检查域名是不是 HTTPS 的!

    点击"开发者技术前线",选择"星标????" 让一部分开发者看到未来 来自:mokeyWie | 责编:乐乐 链接:segmentfault.com/a/119 ...

  2. 起步前要做哪些准备?

    开车前,做好起步的准备工作是必不可少的,有的人可能还不知道开车前要做那些起步工作.    一.开车起步前,检查工作不能忘    1.检查车子轮胎是否完好,若发现轮胎有损毁,及时更换.    2.检查地 ...

  3. 防止内存泄露 Linux下用Valgrind做检查

    Valgrind技术参考 http://valgrind.org/docs/manual/tech-docs.html 防止内存泄露 Linux下用Valgrind做检查 发布时间:2007.10.2 ...

  4. 热点和秒杀来临前要做的5件事

    记得当年<甄嬛传>热播,调用了我们团队的媒体资讯接口.接口被调用挂了.当时虽然我不负责那一块,只是目睹了当时大家在临场解决问题的紧张一幕.但是这件事在我心里埋下了种子,从此追求高可用.高稳 ...

  5. 冷库设计安装前有哪些检查工作

    知道冷库的用户越来越多,但是大多都谈不上了解,只知道一些片面的知识,其实冷库工程在施工之前,必要的准备工作是必须的,今天就说一些冷库设计安装之前应该要做的检查工作. 1.基础的检查基础主要承受制冷压缩 ...

  6. 请牢记看小电影前一定要检查一下域名是不是 HTTPS 的,否则……

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:mokeyWie https://segmentfau ...

  7. 大学生毕业前必须做的20件事

    大学生毕业前必须做的20件事 华仔 [zhihuafe19830124@chinaren] 发表于10-15 14:57 [回复] <script> if(readCookie()){ d ...

  8. 记住下次看小电影前一定要检查域名是不是 HTTPS 的!

    来自:mokeyWie | 责编:乐乐 链接:segmentfault.com/a/1190000023936425          正文    写在前面: 看小电影还是浏览正常网站,一定要检查是不 ...

  9. 面试前该做哪些准备?

    要知道数据分析师的日常工作适合业务紧密结合的,数据分析师每天要关注大量的数据指标 数据分析=业务分析+数据处理手段(工具)=量化业务--发现问题 当面试官提出关于业务方面的问题时,更多的是需要大家快速 ...

最新文章

  1. 腾讯云视频流量服务器,腾讯云服务器有流量限制吗
  2. python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...
  3. android 输入法遮挡布局解决方案
  4. Android --- android.intent.action.MAIN 与 android.intent.category.LAUNCHER常用的几种情况
  5. 虚拟机的三大服务器启动不了,Win7系统下共享虚拟机提示VMware Workstation Server共享服务不能启动如何解决?...
  6. Web前端和后端的区别是什么?如何区分?
  7. 导入新项目报错 Hibernate提示:No generator named ID_GENERATOR is defined in the persistence unit
  8. MAC安装Mysql超详细完整教程
  9. 汽车上都有哪些系统的缩写
  10. 【软件测试-实验-8】测试管理工具应用
  11. 分布式存储系统设计的若干原则
  12. c语言基础课程包括啥,推荐收藏!C语言入门基础知识大全
  13. 数据结构(四):KD树
  14. 什么是token?token是用来干嘛的?
  15. 丁磊向左,刘强东向右
  16. 信息安全等级保护分为几个级别呢?
  17. Sensor Flicker (Sensor banding现象)
  18. 安装spacy遇到的问题
  19. UG NX 12 草图设计
  20. html5视频播放器 知乎,6款让人赞不绝口的电脑软件,知乎超10W人推荐,建议悄悄收藏...

热门文章

  1. 三款telegram中群搜索机器人推荐
  2. 如何最小编译你的软件
  3. 用纯CSS画一颗爱心
  4. 安装opencv4.5.5
  5. Spring Security 之密码存储
  6. 专访松下 | 20多年养老经验,日本养老标杆落地中国的经验与挑战
  7. 无线打印机服务器安全吗,注意安全 彻底拒绝打印机被非法共享
  8. 程序烧录器STLINK_V2CMSIS_DAP_V2制作——DIY方案分享
  9. COSCon'22 论坛集锦 1+16个论坛就等你了!
  10. codevs3147 矩阵乘法 2 (推导小公式)