Java: как определить, является ли тип какой-либо из примитивных/оболочек/строк, или что-то еще

Есть ли один метод в JDK или общих базовых библиотеках, который возвращает true, если тип - это примитив, примитивная оболочка или строка?

т.е.

Class<?> type = ...
boolean isSimple = SomeUtil.isSimple( type );

Потребность в такой информации может быть, например, чтобы проверить, могут ли некоторые данные быть представлены в таких форматах, как JSON. Причина одного метода заключается в том, чтобы использовать его в языке выражения или шаблонах.

Ответ 1

Я нашел что-то:

Commons Lang: (нужно было бы комбинировать с проверкой для String)

ClassUtils.isPrimitiveOrWrapper()

Spring:

BeanUtils.isSimpleValueType()

Это то, что я хочу, но хотел бы иметь его в Commons.

Ответ 2

Есть ли один метод, который возвращает true, если тип является примитивным

Class.isPrimitive:

Class<?> type = ...;
if (type.isPrimitive()) { ... }

Обратите внимание, что void.class.isPrimitive() также является истинным, что может быть или не быть тем, что вы хотите.

примитивная оболочка?

Нет, но их всего восемь, поэтому вы можете проверить их явно:

if (type == Double.class || type == Float.class || type == Long.class ||
    type == Integer.class || type == Short.class || type == Character.class ||
    type == Byte.class || type == Boolean.class) { ... }

a Строка?

Просто:

if (type == String.class) { ... }

Это не один метод. Я хочу определить, является ли это одним из названных или что-то еще, одним методом.

Хорошо. Как насчет:

public static boolean isPrimitiveOrPrimitiveWrapperOrString(Class<?> type) {
    return (type.isPrimitive() && type != void.class) ||
        type == Double.class || type == Float.class || type == Long.class ||
        type == Integer.class || type == Short.class || type == Character.class ||
        type == Byte.class || type == Boolean.class || type == String.class;
}

Ответ 3

Тип java.util.Class имеет соответствующие методы:

Class<?> type = ...

boolean primitive = type.isPrimitive();
boolean string_ = type == String.class;
boolean array = type.isArray();
boolean enum_ = type.isEnum();
boolean interf_ = type.isInterface();

Ответ 5

Целое число, Float, Character и т.д. не являются примитивами; это классы-оболочки, которые служат контейнерами для примитивов. Это ссылочные объекты. Истинными примитивами являются типы типа int, float, double, long, byte, char и boolean - non-object. Там большая разница, так как

значение instanceof Float

даже не компилируется, если "значение" является примитивным. "String" также не является примитивным - это тип объекта. "null" также не является примитивным - это буквальное значение.

Ответ 6

Нет, нет. И не должно быть. Для вопроса о разности деревьев вы должны предоставить дерево разных ответов.

public static <T> boolean  isPrimitive(Class<T> klass) {

    return klass.isPrimitive();
}

public static <T> boolean isString(Class<T> klass) {

    return String.class == klass; //String is final therefor you can not extend it.

}

public static <T> boolean isPrimitiveWrapper(Class<T> klass) {

    return Character.class == klass || Boolean.class == klass || klass.isAssignableFrom(Number.class);

}