[java] 객체가 기본 유형인지 확인

나는이 Object[]배열을, 나는 원시있는 사람을 찾기 위해 노력하고있다. 을 (를) 사용하려고했지만 Class.isPrimitive()뭔가 잘못하고있는 것 같습니다.

int i = 3;
Object o = i;

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

인쇄합니다 java.lang.Integer, false.

올바른 방법이나 대안이 있습니까?



답변

의 종류는 Object[]않습니다 정말 원시적 수 없습니다 – 당신이 참조를 가지고 있기 때문에! 여기서의 유형은 iis int반면에서 참조하는 개체의 유형은 o입니다 Integer(자동 박싱으로 인해).

유형이 “기본 용 래퍼”인지 확인해야하는 것 같습니다. 이를 위해 표준 라이브러리에 내장 된 것이 없다고 생각하지만 코드화는 쉽습니다.

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;
    }
}


답변

commons-lang ClassUtils 에는 관련 메서드가 있습니다.

새 버전에는 다음이 포함됩니다.

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

이전 버전에는 기본 대응 wrapperToPrimitive(clazz)을 반환하는 메서드가 있습니다.

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


답변

Google의 Guava 라이브러리에는 클래스가 프리미티브의 래퍼 유형인지 확인 하는 프리미티브 유틸리티 가 있습니다 Primitives.isWrapperType(class).

Class.isPrimitive ()는 기본 요소에서 작동합니다.


답변

간결한 코드를 좋아하는 사람들을 위해.

private static final Set<Class> WRAPPER_TYPES = new HashSet(Arrays.asList(
    Boolean.class, Character.class, Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class, Void.class));
public static boolean isWrapperType(Class clazz) {
    return WRAPPER_TYPES.contains(clazz);
}


답변

Java 1.5 이상부터는 자동 박싱이라는 새로운 기능이 있습니다. 컴파일러가이 작업을 수행합니다. 기회를 발견하면 기본 유형을 적절한 래퍼 클래스로 변환합니다.

아마도 여기서 일어나는 일은

Object o = i;

컴파일러는이 문장을 다음과 같이 컴파일합니다.

Object o = Integer.valueOf(i);

이것은 자동 권투입니다. 이것은 당신이 받고있는 출력을 설명 할 것입니다. Java 1.5 사양의이 페이지에서는 자동 박싱에 대해 자세히 설명합니다.


답변

Integer원시적 Class.isPrimitive()이지 않고 거짓말이 아닙니다.


답변

나는 이것이 자동 복싱 때문이라고 생각합니다 .

int i = 3;
Object o = i;
o.getClass().getName(); // prints Integer

이러한 특정 권투 클래스와 일치하는 유틸리티 메서드를 구현하고 특정 클래스가 기본 클래스인지 여부를 제공 할 수 있습니다.

public static boolean isWrapperType(Class<?> clazz) {
    return clazz.equals(Boolean.class) || 
        clazz.equals(Integer.class) ||
        clazz.equals(Character.class) ||
        clazz.equals(Byte.class) ||
        clazz.equals(Short.class) ||
        clazz.equals(Double.class) ||
        clazz.equals(Long.class) ||
        clazz.equals(Float.class);
}