
在java泛型中,若需声明一个能容纳所有实现特定接口(如isomething)的类的class对象,应使用通配符上界语法class extends isomething>,而非class
要理解这一设计,关键在于明确 Class
正确解法是使用有界通配符:
Class extends ISomething> clazz; clazz = A.class; // ✅ Class 是 Class extends ISomething> 的子类型 clazz = B.class; // ✅ Class 同样满足(因 B extends A implements ISomething) clazz = ISomething.class; // ✅ 接口自身也满足 ? extends ISomething(接口可“扩展”自身语义)
⚠️ 注意事项:
- ? extends ISomething 表示“某个未知的具体类型,该类型是 ISomething 的子类型(包括实现类或子接口)”,完美匹配 A、B 等具体实现类的 Class 对象;
- 不可反向赋值:Class aClass = clazz; 会编译失败,因为通配符类型是只读的(PECS 原则中的 “Producer Extends”);
- 若后续需通过 clazz 创建实例,需配合 clazz.getDeclaredConstructor().newInstance(),并注意处理 InstantiationException、IllegalAccessException 等异常(Java 9+ 推荐使用 getDeclaredConstructor().newInstance() 替代已弃用的 newInstance());
- 此写法同样适用于抽象类:Class extends AbstractSomething> 可接受其任意非抽象子类。
总结:当目标是泛化地引用“所有实现某接口(或继承某类)的具体类型”的 Class 对象时,务必使用 Class extends InterfaceOrClass>,这是 Java 类型系统对“子类型多态性”在反射层面的标准表达方式。
立即学习“Java免费学习笔记(深入)”;









