14.3 类型转换前先做检查
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 类型转换前先做检查相关推荐
- 记住看小电影前一定要检查域名是不是 HTTPS 的!
点击"开发者技术前线",选择"星标????" 让一部分开发者看到未来 来自:mokeyWie | 责编:乐乐 链接:segmentfault.com/a/119 ...
- 起步前要做哪些准备?
开车前,做好起步的准备工作是必不可少的,有的人可能还不知道开车前要做那些起步工作. 一.开车起步前,检查工作不能忘 1.检查车子轮胎是否完好,若发现轮胎有损毁,及时更换. 2.检查地 ...
- 防止内存泄露 Linux下用Valgrind做检查
Valgrind技术参考 http://valgrind.org/docs/manual/tech-docs.html 防止内存泄露 Linux下用Valgrind做检查 发布时间:2007.10.2 ...
- 热点和秒杀来临前要做的5件事
记得当年<甄嬛传>热播,调用了我们团队的媒体资讯接口.接口被调用挂了.当时虽然我不负责那一块,只是目睹了当时大家在临场解决问题的紧张一幕.但是这件事在我心里埋下了种子,从此追求高可用.高稳 ...
- 冷库设计安装前有哪些检查工作
知道冷库的用户越来越多,但是大多都谈不上了解,只知道一些片面的知识,其实冷库工程在施工之前,必要的准备工作是必须的,今天就说一些冷库设计安装之前应该要做的检查工作. 1.基础的检查基础主要承受制冷压缩 ...
- 请牢记看小电影前一定要检查一下域名是不是 HTTPS 的,否则……
点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:mokeyWie https://segmentfau ...
- 大学生毕业前必须做的20件事
大学生毕业前必须做的20件事 华仔 [zhihuafe19830124@chinaren] 发表于10-15 14:57 [回复] <script> if(readCookie()){ d ...
- 记住下次看小电影前一定要检查域名是不是 HTTPS 的!
来自:mokeyWie | 责编:乐乐 链接:segmentfault.com/a/1190000023936425 正文 写在前面: 看小电影还是浏览正常网站,一定要检查是不 ...
- 面试前该做哪些准备?
要知道数据分析师的日常工作适合业务紧密结合的,数据分析师每天要关注大量的数据指标 数据分析=业务分析+数据处理手段(工具)=量化业务--发现问题 当面试官提出关于业务方面的问题时,更多的是需要大家快速 ...
最新文章
- 腾讯云视频流量服务器,腾讯云服务器有流量限制吗
- python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...
- android 输入法遮挡布局解决方案
- Android --- android.intent.action.MAIN 与 android.intent.category.LAUNCHER常用的几种情况
- 虚拟机的三大服务器启动不了,Win7系统下共享虚拟机提示VMware Workstation Server共享服务不能启动如何解决?...
- Web前端和后端的区别是什么?如何区分?
- 导入新项目报错 Hibernate提示:No generator named ID_GENERATOR is defined in the persistence unit
- MAC安装Mysql超详细完整教程
- 汽车上都有哪些系统的缩写
- 【软件测试-实验-8】测试管理工具应用
- 分布式存储系统设计的若干原则
- c语言基础课程包括啥,推荐收藏!C语言入门基础知识大全
- 数据结构(四):KD树
- 什么是token?token是用来干嘛的?
- 丁磊向左,刘强东向右
- 信息安全等级保护分为几个级别呢?
- Sensor Flicker (Sensor banding现象)
- 安装spacy遇到的问题
- UG NX 12 草图设计
- html5视频播放器 知乎,6款让人赞不绝口的电脑软件,知乎超10W人推荐,建议悄悄收藏...