Как определить примитивный тип примитивной переменной?
Есть ли в Java функция типа typeof, которая возвращает тип переменной типа примитивного типа (PDT) или выражение операндов PDT?
instanceof
, похоже, работает только для типов классов.
Ответы
Ответ 1
Попробуйте следующее:
int i = 20;
float f = 20.2f;
System.out.println(((Object)i).getClass().getName());
System.out.println(((Object)f).getClass().getName());
Он будет печатать:
java.lang.Integer
java.lang.Float
Что касается instanceof
, вы можете использовать его динамический экземпляр Class#isInstance
:
Integer.class.isInstance(20); // true
Integer.class.isInstance(20f); // false
Integer.class.isInstance("s"); // false
Ответ 2
Есть простой способ, который не требует неявного бокса, поэтому вы не будете путаться между примитивами и их обертками. Вы не можете использовать isInstance
для примитивных типов - например. вызов Integer.TYPE.isInstance(5)
(Integer.TYPE
эквивалентен int.class
) вернет false
, поскольку 5
будет автоматически добавлен в Integer
перед началом работы.
Самый простой способ получить то, что вы хотите (обратите внимание - это технически сделано во время компиляции для примитивов, но оно по-прежнему требует оценки аргумента) через перегрузку. Смотрите мою идеонную пасту.
...
public static Class<Integer> typeof(final int expr) {
return Integer.TYPE;
}
public static Class<Long> typeof(final long expr) {
return Long.TYPE;
}
...
Это можно использовать следующим образом, например:
System.out.println(typeof(500 * 3 - 2)); /* int */
System.out.println(typeof(50 % 3L)); /* long */
Это зависит от способности компилятора определить тип выражения и выбрать правильную перегрузку.