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类的实例,然后返回它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |