Каково использование/назначение классов примитивного типа?
Недавно я узнал, что существуют Class представления для примитивных типов в JVM. Например, int.class
, double.class
и даже a void.class
.
Я не понимаю, почему они есть. Кажется, что они не выполняют какую-либо функциональную роль. Используя отражение, я просматривал классы, и у них нет конструкторов, методов и полей. По сути, они кажутся пустыми и бесполезными. Первичные переменные типа не являются даже экземплярами их соответствующих классов, о чем свидетельствует следующее возвращение false:
int a = 3;
int.class.isInstance(a);
Так почему они существуют? Они должны служить какой-то цели, может быть, для компилятора или чего-то еще, но что бы это ни было, полностью вне меня. Существует даже явная ссылка на int.class
в Integer API (а также для каждого примитивного типа и его соответствующего объекта-оболочки). Я не смог найти ссылки на их существование, а тем более их использование, в JLS.
Ответы
Ответ 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
непонятна.