14.3 类型转换前先做检查

来源:互联网 发布:淘宝店铺零食描述 编辑:程序博客网 时间:2024/05/16 18:19

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 请参见 点击打开链接

0 0
原创粉丝点击