如何将 Integer.class (和其他盒装)转换为 int.class (和其他原语)?

Posted

技术标签:

【中文标题】如何将 Integer.class (和其他盒装)转换为 int.class (和其他原语)?【英文标题】:How to convert Integer.class (and other boxed) to int.class (and other primitives)? 【发布时间】:2020-10-29 13:32:33 【问题描述】:

有没有办法将Integer.class 转换为int.class 等其他原始类型?

类似:

jshell> Boolean.class.isPrimitive()
$1 ==> false
jshell> Boolean.class.asPrimitive() == boolean.class
$2 ==> true

【问题讨论】:

第一件事 int 不是一个类,它是一个原语,java 将使用称为自动装箱和拆箱的概念自动转换它 我在问int.class 这是一个Class 这会让你明白什么是 Integer.classint.class ***.com/questions/22470985/integer-class-vs-int-class 没有。您必须将自己的包装类 Map 制作为原始类型。 当您说“将 Integer.class 转换为 int.class”时,恐怕您需要更清楚您的意思。你具体想做什么?注意,当你使用反射时,即使一个字段或方法参数是“int.class”类型的,你为该字段获取的值或通过反射传递给参数的值仍然是一个包装器(即Integer.class)跨度> 【参考方案1】:

使用来自commons-lang 的ClassUtils 可以做到这一点:

jshell> import org.apache.commons.lang3.ClassUtils

jshell> ClassUtils.primitiveToWrapper(int.class)
$1 ==> class java.lang.Integer

jshell> ClassUtils.wrapperToPrimitive(Float.class)
$2 ==> float

【讨论】:

【参考方案2】:

它没有Java SE方法,但是很容易保持一个Map:

private static final Map<Class<?>, Class<?>> wrapperToPrimitive = Map.of(
    Void.class, void.class,
    Boolean.class, boolean.class,
    Byte.class, byte.class,
    Character.class, char.class,
    Short.class, short.class,
    Integer.class, int.class,
    Long.class, long.class,
    Float.class, float.class,
    Double.class, double.class);

【讨论】:

以上是关于如何将 Integer.class (和其他盒装)转换为 int.class (和其他原语)?的主要内容,如果未能解决你的问题,请参考以下文章

Bootstrap 3 的全宽和盒装宽度

如何将盒装切片 (`Box<[T]>`) 传递给 C 函数?

说一个类型是“盒装的”是啥意思?

如何制作垂直和水平居中的盒装div容器[重复]

如何从盒装特质创建特质对象?

盒装卷烟包装系统各部分阻隔性能测试