转换为通用基元 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不同的原语取决于参数。不幸的是,您必须为每个原语使用单独的方法,否则就只能忍受装箱了。