确定对象是否为基元类型

2022-08-31 08:29:11

我有一个数组,我正在尝试找到那些是基元的数组。我尝试使用,但似乎我做错了什么:Object[]Class.isPrimitive()

int i = 3;
Object o = i;

System.out.println(o.getClass().getName() + ", " +
                   o.getClass().isPrimitive());

指纹。java.lang.Integer, false

有没有正确的方法或一些替代方案?


答案 1

中的类型永远不会真正是原始的 - 因为你有引用!这里的类型是,而 引用的对象的类型是(由于自动装箱)。Object[]iintoInteger

听起来你需要找出类型是否是“基元的包装器”。我不认为标准库中内置了任何内容,但是很容易编码:

import java.util.*;

public class Test
{
    public static void main(String[] args)        
    {
        System.out.println(isWrapperType(String.class));
        System.out.println(isWrapperType(Integer.class));
    }

    private static final Set<Class<?>> WRAPPER_TYPES = getWrapperTypes();

    public static boolean isWrapperType(Class<?> clazz)
    {
        return WRAPPER_TYPES.contains(clazz);
    }

    private static Set<Class<?>> getWrapperTypes()
    {
        Set<Class<?>> ret = new HashSet<Class<?>>();
        ret.add(Boolean.class);
        ret.add(Character.class);
        ret.add(Byte.class);
        ret.add(Short.class);
        ret.add(Integer.class);
        ret.add(Long.class);
        ret.add(Float.class);
        ret.add(Double.class);
        ret.add(Void.class);
        return ret;
    }
}

答案 2

commons-lang ClassUtils有相关的方法

新版本具有:

boolean isPrimitiveOrWrapped = 
    ClassUtils.isPrimitiveOrWrapper(object.getClass());

旧版本有方法,它将返回原始对应关系。wrapperToPrimitive(clazz)

boolean isPrimitiveOrWrapped = 
    clazz.isPrimitive() || ClassUtils.wrapperToPrimitive(clazz) != null;