나는이 Object[]
배열을, 나는 원시있는 사람을 찾기 위해 노력하고있다. 을 (를) 사용하려고했지만 Class.isPrimitive()
뭔가 잘못하고있는 것 같습니다.
int i = 3;
Object o = i;
System.out.println(o.getClass().getName() + ", " +
o.getClass().isPrimitive());
인쇄합니다 java.lang.Integer, false
.
올바른 방법이나 대안이 있습니까?
답변
의 종류는 Object[]
않습니다 정말 원시적 수 없습니다 – 당신이 참조를 가지고 있기 때문에! 여기서의 유형은 i
is 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);
}