См. Boolean#TYPE для примера того, что я имею в виду.Примитивные обертки и статические «ТИП» Объект класса
Все классы-оболочки (Boolean, Double, Integer и т. Д.) Имеют статическое поле класса, связанное с ними, которое называется TYPE
. Что это означает?
В частности, здесь есть несколько мягких тестов:
System.out.println(Boolean.class == Boolean.TYPE);
System.out.println(Boolean.TYPE.isInstance(Boolean.valueOf(true)));
Оба оценивают как ложные. (И как примечание стороны, .equals
сравнения является ненужным, так как класс не переопределяет равно от Object.)
Оба Boolean.class
и Boolean.TYPE
являются Class<Boolean>
, потому что они сопоставимы ==
без ошибок. Сравнение двух объектов с разными объявленными типами является незаконным.
При дальнейшем рассмотрении, TYPE
полей извлекаются путем вызова пакета-частный нативный метод Class#getPrimitiveClass
вдоль линий следующего:
public static final Class<Boolean> TYPE = Class.getPrimitiveClass("boolean");
Комментария на самом методе не особо информативен либо. В нем говорится, что он возвращает объект класса VM для типа, который является довольно очевидным, поскольку он является нативным методом.
Я не могу найти никакой документации по этому поводу за пределами неопределенного намека Java-документов на «представление примитивного типа». Есть ли какая-то польза для этого поля? Он не используется в самих классах обертки.
(Edited)
System.out.println(boolean.class == Boolean.TYPE);
Верна.
Также один использование затем отражение:
try {
Constructor ctor = Boolean.class.getConstructor(Boolean.class);
} catch (Exception e) {
System.out.println("NoSuchMethodException gets thrown");
}
try {
Constructor ctor = Boolean.class.getConstructor(Boolean.TYPE);
System.out.println(ctor.newInstance(true));
} catch (Exception e) {
// (no exception thrown)
}
И я нашел некоторые SO темы, которые цитируют, что, например, this one. Я предполагаю, что я пришел из «неправильного конца» Google, чтобы говорить, чтобы не найти никаких результатов.
Но с учетом существования «примитивных классов» (boolean.class
, int.class
и т. Д.), Что на самом деле не объясняет существование ТИП-поля. В основном это «просто»? Я все еще не понимаю.
+1 Другими словами, 'Float.TYPE' относится к действительному примитивному классу, но' Float.class' возвращает тип оболочки, который расширяет 'Object'. – mellamokb
@mellamokb Правильно, вот что происходит. – dasblinkenlight
Знаете ли вы, есть ли какое-либо различие между, например 'Float.TYPE' и' float.class'? Я имею в виду * технически *, а не только * в использовании *, поскольку они, по-видимому, одни и те же объекты во время выполнения. – Radiodef