Java中是否有便捷的显式unsafe cast通用实现方案?
问题解答
首先直接给出结论:既可以用现有类库的现成实现,也可以自行实现,两种方式都是行业通用做法,可根据你的项目依赖情况选择:
- 如果你项目已经引入了常用工具类库,可以直接使用已有实现:
- Apache Commons Lang 3提供了
org.apache.commons.lang3.Cast类,其中的cast(Object obj)方法和你自行实现的unsafeCast逻辑完全一致,内部已经加了@SuppressWarnings("unchecked")注解屏蔽未检查警告,调用方式为:Transporter<Person> transporter = Cast.cast(someObject); - Spring生态项目可以直接使用
org.springframework.util.CastUtils类的cast方法,实现逻辑和上述方法完全相同,无需额外引入依赖。
- Apache Commons Lang 3提供了
- 如果你的项目没有引入上述类库,完全可以自行实现该方法:
该工具方法逻辑非常简单,总共只有3行代码,为了这个单一功能单独引入第三方依赖反而会增加依赖复杂度。目前绝大多数没有引入通用工具库的项目都会选择自行实现,你提到的Gradle,还有MyBatis、Spring Boot等知名开源项目的内部源码中也都有自定义的同款强转工具方法,不会额外引入其他依赖。
补充优化建议:如果在部分场景下你可以拿到目标类型的Class对象,建议额外封装一个带类型校验的重载方法,降低强转风险:
@SuppressWarnings("unchecked") public static <T> T cast(Object obj, Class<T> targetClass) { if (obj != null && !targetClass.isInstance(obj)) { throw new ClassCastException(obj.getClass().getName() + " cannot be cast to " + targetClass.getName()); } return (T) obj; }
只有当你完全确定类型安全、或者无法拿到泛型对应的Class对象(比如泛型集合强转场景)时,再使用无校验的unsafeCast方法即可。
内容的提问来源于stack exchange,提问作者Hakanai
相关产品推荐
相关产品推荐

