这是一种将Object转换为基本类型的方法。
@SuppressWarnings("unchecked")
public <T> T fetchPrimitive(Object object, Class<T> clazz) {
return (T)object;
}
只要我的Object与T(它是一个像int,double等原始类)相同的类,它就可以正常工作。
但是,当我提供错误的类来进行强制转换时,此方法也会毫无例外地运行。假设我将对象提供为boolean(true / false)并将clazz作为int.class提供,那么此方法也会运行并返回(true / false)实际的Object。
我知道Generics无法处理原语。当我提供一个原始类作为参数并且返回类型是Generic时,我只需要了解这里发生的事情。
例如:
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?
从运行代码开始,我理解它只是在它是一个原始类并且返回它所有的Object时忽略了转换。我不希望它是这样的,如果提供了错误的类,我希望它抛出一个异常(ClassCastException)。
答案 0 :(得分:4)
由于您提供了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;
}
这绝对有效。
答案 1 :(得分:1)
由于JVM的工作方式,这根本不适用于原语。由于您的返回类型为T
,因此会将其删除为Object
(如在Flown的回答中所示),即使您返回原语,也会将其重新包装回Integer
/ Boolean
/等
如果希望该方法能够返回一个原语,则必须在返回类型中指定它,并且方法无法根据参数返回不同的原语。不幸的是,你必须为每个原语设置单独的方法,或者与拳击一起生活。