问题

我有一个Object[]阵列,我试图找到那些原始的。我试过使用Class.isPrimitive(),但似乎我做错了什么:

int i = 3;
Object o = i;

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

printsjava.lang.Integer, false

有正确的方法还是其他选择?


#1 热门回答(146 赞)

anObject[]中的类型永远不会是原始的 - 因为你有参考!这里的类型为iisint,其中引用的对象类型为oisInteger(由于自动装箱)。

听起来你需要弄清楚这种类型是否是"原始包装"。我认为标准库中没有内置任何内容,但编码很容易:

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 热门回答(70 赞)

commons-langClassUtils有相关方法。新版本有:

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

旧版本有4774704575方法,它将返回原始对应关系。所以你可以这样做:

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

#3 热门回答(23 赞)

Google的Guava库有一个Primitives实用程序,用于检查类是否是基元的包装类型:http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/primitives/Primitives.html

Primitives.isWrapperType(class)

Class.isPrimitive()适用于基元


原文链接