我们如何识别给定变量的原始数据类型?
答案 0 :(得分:2)
您尝试做的事情当然只适用于您正在使用反射(并再次使用Object
)。然后,您可以使用以下标识来识别类型:
field.getType()
或
field.getType().getName()
取决于您是想要名称还是Class
然后,您可以与Integer.TYPE
,Double.TYPE
等进行比较,这些是原始Class
表示。
答案 1 :(得分:1)
我认为你的意思是Java。答案取决于谁在进行识别:
如果您是一个程序员并且正在阅读代码,那么您可以通过向上读取当前方法查找变量声明来找出变量的类型。如果在那里找不到它,请查看当前类以获取该名称的实例变量的声明。声明总是在Java中给出类型(与强类型但具有良好类型推断的Haskell或Scala不同),因此您永远不需要查看变量声明。
如果您是编译器并且从源代码生成代码,那么您可以采用与编程人员相同的方法。此外,您还有一些额外的选择 - 在许多情况下,您可能能够确定变量不会在您正在编译的代码块之外“逃逸”,因此您甚至可能永远不会创建变量...只是保持寄存器中的数据。
如果您是执行计划,则存在一些定义问题。找到变量的类型是没有意义的 - 变量只是代码中的标签,运行时真正存在的是存储在这些变量中的对象。然而, 非常合理,对于某些对象类型,您可能有一些泛型类型的变量,并想知道实际实例的实际类型。 (对于原始类型,没有子类,因此问题永远不会出现。)例如,您可能会这样:
public void someFunc(Animal animal) {
// Here I want to know if 'animal' is a 'Dog' or a 'Cat'
}
在这种情况下,您可以使用Java中所有对象上的getClass()方法:
public void someFunc(Animal animal) {
System.out.println("The type of animal is: " + animal.getClass());
}
希望这有帮助!
答案 2 :(得分:0)
我认为你不能。
我的意思是......如果我创建一个“学生”类型的对象,原始的是什么?没有意义。
答案 3 :(得分:0)
您可以尝试:
char a = '0'; //any primitive
Object obj = a;
System.out.println(obj.getClass().getName());
在这种情况下,它将打印:java.lang.Character
答案 4 :(得分:-4)
我认为你正在寻找这方面的东西
private final static Map<Class<?>, Class<?>> simpleTypes = new Hashtable<Class<?>, Class<?>>();
static {
simpleTypes.put(String.class, String.class);
simpleTypes.put(Boolean.class, Boolean.class);
simpleTypes.put(boolean.class, boolean.class);
simpleTypes.put(Byte.class, Byte.class);
simpleTypes.put(byte.class, byte.class);
simpleTypes.put(Short.class, Short.class);
simpleTypes.put(short.class, short.class);
simpleTypes.put(Integer.class, Integer.class);
simpleTypes.put(int.class, int.class);
simpleTypes.put(Long.class, Long.class);
simpleTypes.put(long.class, long.class);
simpleTypes.put(Float.class, Float.class);
simpleTypes.put(float.class, float.class);
simpleTypes.put(Double.class, Double.class);
simpleTypes.put(double.class, double.class);
simpleTypes.put(Character.class, Character.class);
simpleTypes.put(char.class, char.class);
simpleTypes.put(BigDecimal.class, BigDecimal.class);
simpleTypes.put(StringBuffer.class, StringBuffer.class);
simpleTypes.put(BigInteger.class, BigInteger.class);
simpleTypes.put(Class.class, Class.class);
simpleTypes.put(java.sql.Date.class, java.sql.Date.class);
simpleTypes.put(java.util.Date.class, java.util.Date.class);
simpleTypes.put(Time.class, Time.class);
simpleTypes.put(Timestamp.class, Timestamp.class);
simpleTypes.put(Calendar.class, Calendar.class);
simpleTypes.put(GregorianCalendar.class, GregorianCalendar.class);
simpleTypes.put(URL.class, URL.class);
simpleTypes.put(Object.class, Object.class);
}
public static boolean isSimpleType(final Object object) {
if (object == null) { return false; }
return isSimpleType(object.getClass());
}
public static boolean isSimpleType(final Class<?> clazz) {
if (clazz == null) { return false; }
return simpleTypes.containsKey(clazz);
}
public static boolean isMapType(final Class<?> clazz) {
boolean lvReturn = false;
if (clazz != null) {
lvReturn = (Map.class.isAssignableFrom(clazz));
}
return lvReturn;
}
public static boolean isMapType(final Object object) {
boolean lvReturn = false;
if (object == null) {
lvReturn = false;
}
else if (object instanceof Map) {
lvReturn = true;
}
return lvReturn;
}
public static boolean isCollection(final Object object) {
boolean lvReturn = false;
if (object == null) {
lvReturn = false;
}else{
lvReturn=isCollection(object.getClass());
}
return lvReturn;
}
public static boolean isCollection(final Class<?> clazz) {
boolean lvReturn = false;
if (clazz == null) {
lvReturn = false;
}
else if (Collection.class.isAssignableFrom(clazz)) {
lvReturn = true;
}
return lvReturn;
}
public static boolean isArray(final Object obj) {
if (obj == null) {
return false;
}
return isArray(obj.getClass());
}
public static boolean isArray(final Class<?> clazz) {
boolean lvReturn = false;
if (clazz == null) {
lvReturn = false;
}else if(clazz.isArray()) {
lvReturn = true;
}
return lvReturn;
}
public static boolean isEnum(final Object obj) {
if (obj == null) {
return false;
}
return isEnum(obj.getClass());
}
public static boolean isEnum(final Class<?> clazz) {
boolean lvReturn = false;
if (clazz == null) {
lvReturn = false;
}else if (clazz.isEnum()) {
lvReturn = true;
}
return lvReturn;
}