Java中类型的超类型是否仅含直接继承/实现的类型?反射API场景咨询
关于ArrayList超类型与Reflection API的使用说明
一、ArrayList的完整超类型
ArrayList的超类型不止是直接声明的那些,还包含所有间接继承/实现的类型:
- 直接关联类型:
- 直接父类:
AbstractList - 直接实现的接口:
List、RandomAccess、Cloneable、Serializable
- 直接父类:
- 间接关联类型:
- 间接父类:
AbstractCollection(AbstractList的父类)、Object(所有Java类的根父类) - 间接实现的接口:
Collection(List的父接口)、Iterable(Collection的父接口)
- 间接父类:
二、Reflection API获取超类型的方法
如果要统计全部超类型(含间接),需要递归遍历类型的继承/实现链:
- 获取直接父类:通过
Class.getSuperclass(),直到返回null(即遍历到Object之后) - 获取所有接口:通过
Class.getInterfaces(),同时递归遍历每个接口的父接口
示例代码片段:
public static void collectAllSupertypes(Class<?> clazz, Set<Class<?>> supertypes) { // 处理父类链 Class<?> superclass = clazz.getSuperclass(); if (superclass != null) { supertypes.add(superclass); collectAllSupertypes(superclass, supertypes); } // 处理接口链 for (Class<?> iface : clazz.getInterfaces()) { supertypes.add(iface); collectAllSupertypes(iface, supertypes); } }
调用该方法传入ArrayList.class,就能得到所有直接+间接的超类型集合。
三、项目统计的注意事项
你的需求是找出超类型数量最多的类型,必须把间接超类型纳入统计——否则会遗漏大量继承链上的类型,导致统计结果完全失真。比如ArrayList的完整超类型(不含自身)就有9个,远多于直接声明的5个。
内容的提问来源于stack exchange,提问作者Dchol
相关产品推荐
相关产品推荐

