java – 为什么隐式转换在反射投射抛出异常时有效?
|
假设有以下代码: @SuppressWarnings("unchecked")
public static <T> T implicitCaster(Class<T> cls,Object o) {
return (T) o;
}
public static <T> T reflectionCaster(Class<T> cls,Object o) {
return cls.cast(o);
}
代码在两种情况下都按预期工作,但在基元中有以下异常: public static void main(String[] args) {
System.out.println(implicitCaster(int.class,42));
System.out.println(reflectionCaster(int.class,42));
}
第一个调用按预期工作,但第二个调用抛出java.lang.ClassCastException. 这是一个不考虑自动装箱的角落案例吗?或者在这种情况下,反射铸造是否不可能提供自动装箱? 编辑:调用此代码按预期工作: public static void main(String[] args) {
System.out.println(implicitCaster(Integer.class,42));
System.out.println(reflectionCaster(Integer.class,42));
}
解决方法这是因为类型擦除.在运行时,不存在泛型类型参数. 因此,您的第一行自动装箱42将Object传递给该方法. 您的第二个调用调用int基本类型的强制转换方法. 当cast()checks
(重点补充) 您的编辑有效,因为您不再使用基本类型. 与以前一样,第一次通话无效.第二个调用验证盒装整数实际上是Integer类的实例,然后返回它. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 使用MockRestServiceServer模拟REST调用
- Java读取txt文件和写入txt文件的简单实例
- XXXSummaryStatistics java-10中的新构造函数
- SpringBoot和Swagger结合提高API开发效率
- Andriod实现刮刮卡的效果
- Hibernate映射文件id的generator配置方法
- java – 使用注释进行跟踪记录
- java – Liferay 6.1 – 私有插件安装程序“disapear”或在
- java – 使用volatile和synchronized时,刷新或发布到各种线
- java – 使用基于Spring MVC注释的控制器和@RequestMapping
