gpt4 book ai didi

java - 为什么隐式转换工作而反射转换抛出异常?

转载 作者:搜寻专家 更新时间:2023-10-31 20:21:05 25 4
gpt4 key购买 nike

假设有如下代码:

@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 以传递给该方法。
该函数然后返回传递给 System.out.printlnObject


您的第二个调用调用了 int 基本类型的 cast 方法。
这会引发异常,因为对象无法转换为原始类型。 (自动装箱是一个纯粹的编译时特性,所以它没有帮助)

错误发生在 cast() checks isInstance()验证转换是否有效。

isInstance() say 的文档:

Specifically, if this Class object represents a declared class, this method returns true if the specified Object argument is an instance of the represented class (or of any of its subclasses); it returns false otherwise. If this Class object represents an array class, this method returns true if the specified Object argument can be converted to an object of the array class by an identity conversion or by a widening reference conversion; it returns false otherwise. If this Class object represents an interface, this method returns true if the class or any superclass of the specified Object argument implements this interface; it returns false otherwise. If this Class object represents a primitive type, this method returns false.

(强调)


您的编辑工作正常,因为您不再使用原始类型。
在这两种情况下,编译器都会自动装箱 42 以便它可以作为对象传递。

和以前一样,第一次调用没有效果。
第二次调用验证装箱整数实际上是 Integer 类的实例,然后返回它。

关于java - 为什么隐式转换工作而反射转换抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17596835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com