Как определить примитивный тип примитивной переменной?

Есть ли в 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 */

Это зависит от способности компилятора определить тип выражения и выбрать правильную перегрузку.