Ответ 1
Я нашел что-то:
Commons Lang: (нужно было бы комбинировать с проверкой для String)
ClassUtils.isPrimitiveOrWrapper()
BeanUtils.isSimpleValueType()
Это то, что я хочу, но хотел бы иметь его в Commons.
Есть ли один метод в JDK или общих базовых библиотеках, который возвращает true, если тип - это примитив, примитивная оболочка или строка?
т.е.
Class<?> type = ...
boolean isSimple = SomeUtil.isSimple( type );
Потребность в такой информации может быть, например, чтобы проверить, могут ли некоторые данные быть представлены в таких форматах, как JSON. Причина одного метода заключается в том, чтобы использовать его в языке выражения или шаблонах.
Я нашел что-то:
Commons Lang: (нужно было бы комбинировать с проверкой для String)
ClassUtils.isPrimitiveOrWrapper()
BeanUtils.isSimpleValueType()
Это то, что я хочу, но хотел бы иметь его в Commons.
Есть ли один метод, который возвращает true, если тип является примитивным
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;
}
Тип 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();
Гуава предоставляет Primitives
классу Primitives.isWrapperType(class)
, который возвращает true
для Integer
, Long
,...
Целое число, Float, Character и т.д. не являются примитивами; это классы-оболочки, которые служат контейнерами для примитивов. Это ссылочные объекты. Истинными примитивами являются типы типа int, float, double, long, byte, char и boolean - non-object. Там большая разница, так как
значение instanceof Float
даже не компилируется, если "значение" является примитивным. "String" также не является примитивным - это тип объекта. "null" также не является примитивным - это буквальное значение.
Нет, нет. И не должно быть. Для вопроса о разности деревьев вы должны предоставить дерево разных ответов.
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);
}