Подтвердить что ты не робот

Каково использование/назначение классов примитивного типа?

Недавно я узнал, что существуют Class представления для примитивных типов в JVM. Например, int.class, double.class и даже a void.class.

Я не понимаю, почему они есть. Кажется, что они не выполняют какую-либо функциональную роль. Используя отражение, я просматривал классы, и у них нет конструкторов, методов и полей. По сути, они кажутся пустыми и бесполезными. Первичные переменные типа не являются даже экземплярами их соответствующих классов, о чем свидетельствует следующее возвращение false:

int a = 3;
int.class.isInstance(a);

Так почему они существуют? Они должны служить какой-то цели, может быть, для компилятора или чего-то еще, но что бы это ни было, полностью вне меня. Существует даже явная ссылка на int.class в Integer API (а также для каждого примитивного типа и его соответствующего объекта-оболочки). Я не смог найти ссылки на их существование, а тем более их использование, в JLS.

4b9b3361

Ответ 1

Я не понимаю, почему они есть.

Рассмотрим следующее:

public int foo() {
    return 0;
}

...

Method method = someClass.getDeclaredMethod("foo");
Class<?> clazz = method.getReturnType();

Без Class представления int, что бы вернуть выше? Он не должен возвращать Integer.class, поскольку это не одно и то же. (Представьте, что вы пытаетесь различать перегруженные методы, один с int и один с параметром Integer.)

Я использовал эти классы раньше, чтобы предоставить значения по умолчанию для аргументов при вызове их через отражение. Основываясь на типе параметра, я использовал null для любого ссылочного типа и некоторого (в штучной, очевидно) примитивном значении для каждого из примитивных типов.

Ответ 2

Это недорогая задница, которая получается плохо.

До 1,5 типов Java можно классифицировать как

java type
    primitive type
    reference type
        class type (including interface)
        array type

В идеале, java-отражение должно содержать 5 концепций, отражающих эти 5 типов. Но они использовали один Class, чтобы представить их все, включая примитивные и массивные типы. Таким образом, Class не обязательно означает класс.

Это все еще управляемо. Но после 1.5 типы Java становятся более сложными, поэтому вводится новый Type. К сожалению, вместо новой и чистой иерархии, непосредственно отражающей спецификацию языка, они решают сделать Class подтип Type; не только старая путаница, но и порождает новый беспорядок, а целая иерархия Type непонятна.