Как мы можем идентифицировать примитивный тип данных данной переменной? - PullRequest
0 голосов
/ 08 января 2010

Как мы можем идентифицировать примитивный тип данных данной переменной?

Ответы [ 4 ]

2 голосов
/ 08 января 2010

То, что вы пытаетесь сделать, конечно, применимо, только если вы работаете с отражением (и снова набираете Object). Затем вы можете определить тип с помощью:

field.getType()

или

field.getType().getName()

в зависимости от того, хотите ли вы имя или Class

Затем вы можете сравнить с Integer.TYPE, Double.TYPE и т. Д., Которые являются простыми Class представлениями.

1 голос
/ 08 января 2010

Я предполагаю, что вы имеете в виду на Java. Ответ зависит от того, кто делает идентификацию:

Если вы являетесь ПРОГРАММИСТОМ и читаете код, то вы можете узнать тип переменной, читая вверх по текущему методу в поисках объявления переменной. Если он там не найден, посмотрите в текущем классе объявление переменной экземпляра с таким именем. Объявления всегда дают тип в Java (в отличие от Haskell или Scala, которые строго типизированы, но имеют хороший вывод типов), поэтому вам никогда не придется смотреть дальше, чем объявление переменной.

Если вы являетесь КОМПИЛЕРОМ и генерируете код из исходного кода, вы можете использовать тот же подход, что и программист. Кроме того, у вас также есть несколько дополнительных вариантов - во многих случаях вы можете определить, что переменная не «выходит» за пределы блока кода, который вы компилируете, и, следовательно, вы можете даже никогда не создать переменную ... просто сохраняйте данные в регистре.

Если вы ИСПОЛНИТЕЛЬНАЯ ПРОГРАММА, тогда возникает вопрос об определениях. Найти тип переменной бессмысленно - переменные - это всего лишь метки в коде, а во время выполнения на самом деле существуют объекты, хранящиеся в этих переменных. Однако равно , вполне вероятно, что для некоторого типа объекта у вас может быть переменная какого-то универсального типа, и вы хотите знать, что является реальным типом реального экземпляра. (Для примитивных типов нет подклассов, поэтому проблема никогда не может возникнуть.) Например, у вас может быть это:

public void someFunc(Animal animal) {
    // Here I want to know if 'animal' is a 'Dog' or a 'Cat'
}

В этом случае вы можете использовать метод getClass (), который присутствует на всех объектах в Java:

public void someFunc(Animal animal) {
    System.out.println("The type of animal is: " + animal.getClass());
}

Надеюсь, это поможет!

0 голосов
/ 08 января 2010

Я думаю, что вы ищете что-то вроде этого

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;
}
0 голосов
/ 08 января 2010

Я не думаю, что вы можете.

Я имею в виду ... если я создам объект типа "Студент", что будет примитивом? Не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...