Class.isAssignableFrom();执行运行时的检查,以校验传递的对象确实属于我们感兴趣的继承结构。
统计基类和确切类型个数。import java.util.HashMap; import java.util.Map; /** * @author E-mail: * @version 2018年6月2日 上午11:45:49 */ public class TypeCounter extends HashMap, Integer> { private Class> baseType; public TypeCounter(Class> baseType){ this.baseType = baseType; } public void count(Object obj){ Class> type = obj.getClass(); if(!baseType.isAssignableFrom(type)) throw new RuntimeException(obj + " incorrect type:" +type+",should be type or subtype of "+baseType ); countClass(type); } private void countClass(Class> type){ Integer quantity = get(type); put(type,quantity==null?1:quantity+1); Class> superClass = type.getSuperclass(); if(superClass!=null&&baseType.isAssignableFrom(superClass)) countClass(superClass); } public String toString(){ StringBuilder result = new StringBuilder("{"); for(Map.Entry, Integer> pair : entrySet()){ result.append(pair.getKey().getSimpleName()); result.append("="); result.append(pair.getValue()); result.append(", "); } result.delete(result.length()-2, result.length()); result.append("}"); return result.toString(); } }