我们如何识别给定变量的原始数据类型?

时间:2010-01-08 14:10:07

标签: java

我们如何识别给定变量的原始数据类型?

5 个答案:

答案 0 :(得分:2)

您尝试做的事情当然只适用于您正在使用反射(并再次使用Object)。然后,您可以使用以下标识来识别类型:

field.getType()

field.getType().getName()

取决于您是想要名称还是Class

然后,您可以与Integer.TYPEDouble.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;
}