转换为Generic Primitive类。方法运行没有任何异常,如何以及为什么?

时间:2015-10-10 10:43:11

标签: java generics casting primitive

这是一种将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)。

2 个答案:

答案 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 /等

如果希望该方法能够返回一个原语,则必须在返回类型中指定它,并且方法无法根据参数返回不同的原语。不幸的是,你必须为每个原语设置单独的方法,或者与拳击一起生活。