
在java泛型中,若需声明一个可存储任意实现某接口(如isomething)的类对象(class>)的变量,应使用通配符上界语法 class extends isomething>,而非 class
要正确表达“某个 Class 对象代表的类实现了 ISomething 接口”这一约束,必须使用带上限的通配符:
interface ISomething { /* ... */ }
class A implements ISomething { /* ... */ }
class B extends A { /* ... */ }✅ 正确声明方式:
Class extends ISomething> clazz; clazz = A.class; // 合法:A 实现 ISomething clazz = B.class; // 合法:B 继承 A → 也实现 ISomething clazz = ISomething.class; // 合法:接口类型本身也满足 ? extends ISomething(注意:Class中 T 可为接口)
⚠️ 注意事项:
- Class
是非法且无意义的:ISomething.class 是一个 Class ,但它不代表“某个实现类”,而仅代表接口类型自身;你无法用 new ISomething() 创建实例,因此 Class 无法用于描述具体实现类的 Class 对象。 - ? extends ISomething 表示“某个未知的具体类型,该类型是 ISomething 的子类型(包括实现类或子接口)”,完美契合运行时 Class 对象的语义。
- 若后续需通过 clazz 实例化对象,需配合 clazz.getDeclaredConstructor().newInstance()(注意处理异常与构造器可见性),且确保目标类有无参构造器。
? 小结:当目标是泛化地持有“任意实现某接口的类的 Class 引用”时,唯一类型安全、编译通过且语义准确的写法是 Class extends ISomething>。这是 Java 泛型中上界通配符(bounded wildcard)的典型应用场景。
立即学习“Java免费学习笔记(深入)”;










