Есть простой способ, который не требует неявного бокса, поэтому вы не будете путаться между примитивами и их обертками. Вы не можете использовать 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 */
Это зависит от способности компилятора определить тип выражения и выбрать правильную перегрузку.