1. Class.cast 与普通强制类型转换相比提供什么动态类型保证,Class.asSubclass 又解决什么问题
Class.cast 与普通强制类型转换相比提供什么动态类型保证?Class.asSubclass 解决什么问题?
- Class.cast 动态类型检查
- 普通强转的编译期检查
- asSubclass 的用途
Class.cast(obj) 是动态类型检查:在运行时检查 obj 是否是 Class 代表的类型,若是则返回,否则抛 ClassCastException。它比普通强转的"编译期检查"多一层运行时保证(普通强转在编译期无法确定类型时也可运行,但错误在运行时抛 CCE)。Class.cast 常用于"运行时才知道类型"的场景(如泛型擦除后从 Object 恢复类型)。Class.asSubclass(Class) 检查当前类是否是给定类的子类,若是返回子类 Class,否则抛 ClassCastException。它解决"运行时验证类型层次关系"并将 Class 类型收窄为子类 Class 的问题,常用于反射中确保类型兼容。
cast 做运行时类型检查返回实例,asSubclass 做运行时类型层次检查并收窄 Class 类型。二者都是运行时动态类型保证。
Class<?> cls = ...;
// 动态类型检查
Object obj = ...;
String s = cls.cast(obj); // 若 obj 不是该类型抛 CCE
// 运行时类型层次验证
Class<? extends Number> nc = Number.class.asSubclass(Integer.class); // 会抛 CCE