转换为通用基元 class。方法运行无任何异常,如何以及为什么?
Casting to a Generic Primitive class. Method runs without any exception, how and why?
这是我将对象转换为基本类型的方法。
@SuppressWarnings("unchecked")
public <T> T fetchPrimitive(Object object, Class<T> clazz) {
return (T)object;
}
只要我的对象与 T 具有相同的 class(它是原始的 class,如 int、double 等),它就可以正常工作。
但是,当我提供错误的 class 进行转换时,此方法也无一例外地运行。假设我将对象提供为布尔值 (true/false) 并将 clazz 提供为 int.class,那么此方法也会运行并且 return (true/false) 实际对象。
我知道泛型不能作用于原语。当我提供原始 class 作为参数并且 return 类型是通用时,我只需要了解这里发生了什么。
例如:
Object object = true;
Class clazz = int.class;
Object result = fetchPrimitive(object,clazz);
//result = true and result.getClass() is Boolean.
//I asked it to convert a boolean to int expecting an exception but seems that it simply ignored the casting?
从 运行 代码中,我了解到当它是一个原始 class 和 return 对象时,它只是忽略了转换。我不希望它是这样的,我希望它在提供错误的 class 时抛出异常 (ClassCastException)。
既然你已经提供了 clazz,你可以使用 Class::cast
来获得你想要的东西:
public static <T> T fetchPrimitive(Object object, Class<T> clazz) {
return clazz.cast(object);
}
如果您只进行强制类型擦除,会将您的代码转换成如下形式:
public static Object fetchPrimitive(Object object, Class<Object> clazz) {
return (Object) object;
}
这绝对有效。
由于 JVM 的工作方式,这根本不适用于原语。由于您的 return 类型是 T
,它会被擦除为 Object
(如 Flown 的回答所示),即使您 return 是原始类型,它也会被装回 Integer
/Boolean
/等等
如果你想让方法能够return一个原始类型,它必须在return类型中指定,并且方法无法return不同的原语取决于参数。不幸的是,您必须为每个原语使用单独的方法,否则就只能忍受装箱了。
这是我将对象转换为基本类型的方法。
@SuppressWarnings("unchecked")
public <T> T fetchPrimitive(Object object, Class<T> clazz) {
return (T)object;
}
只要我的对象与 T 具有相同的 class(它是原始的 class,如 int、double 等),它就可以正常工作。
但是,当我提供错误的 class 进行转换时,此方法也无一例外地运行。假设我将对象提供为布尔值 (true/false) 并将 clazz 提供为 int.class,那么此方法也会运行并且 return (true/false) 实际对象。
我知道泛型不能作用于原语。当我提供原始 class 作为参数并且 return 类型是通用时,我只需要了解这里发生了什么。
例如:
Object object = true;
Class clazz = int.class;
Object result = fetchPrimitive(object,clazz);
//result = true and result.getClass() is Boolean.
//I asked it to convert a boolean to int expecting an exception but seems that it simply ignored the casting?
从 运行 代码中,我了解到当它是一个原始 class 和 return 对象时,它只是忽略了转换。我不希望它是这样的,我希望它在提供错误的 class 时抛出异常 (ClassCastException)。
既然你已经提供了 clazz,你可以使用 Class::cast
来获得你想要的东西:
public static <T> T fetchPrimitive(Object object, Class<T> clazz) {
return clazz.cast(object);
}
如果您只进行强制类型擦除,会将您的代码转换成如下形式:
public static Object fetchPrimitive(Object object, Class<Object> clazz) {
return (Object) object;
}
这绝对有效。
由于 JVM 的工作方式,这根本不适用于原语。由于您的 return 类型是 T
,它会被擦除为 Object
(如 Flown 的回答所示),即使您 return 是原始类型,它也会被装回 Integer
/Boolean
/等等
如果你想让方法能够return一个原始类型,它必须在return类型中指定,并且方法无法return不同的原语取决于参数。不幸的是,您必须为每个原语使用单独的方法,否则就只能忍受装箱了。