Obtaining Field Types
A field may be either of primitive or reference type. There are eight primitive types: boolean , byte , short , int , long , char , float , and double . A reference type is anything that is a direct or indirect subclass of java.lang.Object including interfaces, arrays, and enumerated types.
The FieldSpy example prints the field's type and generic type given a fully-qualified binary class name and field name.
Sample output to retrieve the type of the three public fields in this class ( b , name , and the parameterized type list ), follows. User input is in italics.
How do you know a variable type in java? [duplicate]
And I want to know what type it is, i.e., the output should be java.lang.String How do I do this?
![]()
7 Answers 7
Expanding on Martin’s answer.
Martins Solution
Expanded Solution
If you want it to work with anything you can do this:
In case of a primitive type, it will be wrapped (Autoboxed) in a corresponding Object variant.
Example #1 (Regular)
Example #2 (Generics)
Additional Learning
- Material on Java Types, Values and Variables: https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html
- Autoboxing and Unboxing: https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
- Docs on Pattern Matching for instanceof: https://docs.oracle.com/en/java/javase/14/language/pattern-matching-instanceof-operator.html
![]()
If you want the name, use Martin’s method. If you want to know whether it’s an instance of a certain class:
boolean b = a instanceof String
I learned from the Search Engine(My English is very bad , So code. ) How to get variable’s type? Up’s :
![]()
![]()
Use operator overloading feature of java
![]()
![]()
I think we have multiple solutions here:
- instance of could be a solution.
Why? In Java every class is inherited from the Object class itself. So if you have a variable and you would like to know its type. You can use
- System.out.println(((Object)f).getClass().getName());
- Integer.class.isInstance(1985); // gives true
![]()
I agree with what Joachim Sauer said, not possible to know (the variable type! not value type!) unless your variable is a class attribute (and you would have to retrieve class fields, get the right field by name. )
Actually for me it’s totally impossible that any a.xxx().yyy() method give you the right answer since the answer would be different on the exact same object, according to the context in which you call this method.
As teehoo said, if you know at compile a defined list of types to test you can use instanceof but you will also get subclasses returning true.
Выведение типов Java-компилятором

Программисты любят, когда какой-то сложный код или логику можно написать парой строк, и код при этом компактный и читаемый. А разработчики языков иногда помогают им в этом.
Хитрые особенности языка, которые позволяют использовать более короткий путь (писать меньше кода), называют синтаксическим сахаром . Хотя, честно говоря, в Java его совсем немного.
Разработчики Java сделали все, чтобы устранить из Java всю возможную избыточность. Если в C++ что-то можно сделать десятью способами, в Java чаще всего это можно сделать только одним способом.
Но такая унификация не нравится ни Java-программистам, ни создателям Java. И иногда они упрощают жизнь обычным ребятам вроде нас с вами.
Вы, кстати, уже познакомились с вещью, которую можно отнести к синтаксическому сахару — это autoboxing и unboxing . Сравните:
| Длинный код | Компактный код |
|---|
Вместо длинного кода как слева вы можете писать более компактный код, как справа. А умный Java-компилятор на основе краткого кода сам сгенерирует его полную версию. Это и есть синтаксический сахар.
2. Выведение типа переменной – var
В Java 11 компилятор стал еще умнее и теперь может определить тип создаваемой переменной по типу значения, которое ей присваивают. Выглядит это в коде так:
Где имя — это имя новой переменной, значение — ее стартовое значение, а var — это ключевое слово, используемое для объявления переменной. Тип у переменной имя будет такой же, как у значения, которое ей присваивают.
| Как этот код видим мы | Что видит компилятор |
|---|
Компилятор сам определяет или, как еще говорят, выводит тип переменной на основе значения, которое ей присваивают.
Немало копий было сломлено в баталиях программистов на тему того, стоит ли добавлять такую возможность в язык или нет. Многие боялись, что использованием var начнут злоупотреблять, и читаемость кода сильно снизится.
Доля истины в этом есть, так что лучше всего использовать var там, где это повышает читабельность кода. Например, этих в двух случаях:
Случай 1: глядя на значение переменной сразу ясно, какой тип у переменной
| Код | Пояснение |
|---|---|
| У переменной тип InputStream | |
| У переменной тип String |
А вот в этих случаях использовать var не стоит . Ну-ка ответьте, какой тип у переменной?
| Код | Пояснение |
|---|---|
| Тип переменной определить сложно | |
| Тип переменной определить сложно |
Случай 2: тип переменной не важен для понимания кода
Часто в коде могут быть ситуации, когда у переменной не вызываются никакие методы – переменная просто используется для временного хранения чего-либо. Использование var тут абсолютно не снижает понимание кода:
| Длинный код | Компактный код |
|---|---|
| Мы получили метаданные из потока stream и сохранили их в хранилище storage . Какой именно тип был у переменной data — не важно. |
Золотая середина
Сейчас приведу три способа записи одного и того же кода. Использование var будет оптимальным вариантом.
| Код | Примечание |
|---|---|
| Слишком компактно | |
| Идеально | |
| Слишком подробно |
Когда мы перешли от варианта в строке 1 к варианту в строке 2, мы за счет имени переменной ( headerInfo ) добавили коду немного читаемости. Теперь ясно, что метод возвращал не просто метаинформацию, а информацию о заголовке.
Третий вариант был бы избыточным. Ну и что, что headerInfo имеет тип FileMetaInfo — это и так было почти понятно по методу getFileMetaInfo() . Гораздо интереснее назначение этой метаинформации.
Как проверить тип переменной в Java?
Как я могу проверить, чтобы моя переменная была int, array, double и т.д.
Изменить: Например, как я могу проверить, что переменная является массивом? Есть ли какая-нибудь функция для этого?
11 ответов
Java — это статически типизированный язык, поэтому компилятор делает большую часть этой проверки для вас. Когда вы объявляете переменную определенным типом, компилятор будет гарантировать, что это только когда-либо назначенные значения этого типа (или значения, которые являются подтипами этого типа).
Приведенные вами примеры (int, array, double) — это все примитивы, а подтипов их нет. Таким образом, если вы объявляете переменную как int :
Вы можете быть уверены, что он будет удерживать только int значения.
Если вы указали переменную как List , однако, возможно, что переменная будет содержать подтипы List . К ним относятся: ArrayList , LinkedList и т.д.
Если у вас есть переменная List , и вам нужно знать, была ли она ArrayList , вы могли бы сделать следующее:
Однако, если вы считаете, что вам нужно это сделать, вы можете подумать о своем подходе. В большинстве случаев, если вы будете следовать объектно-ориентированным принципам, вам не нужно будет этого делать. Конечно, есть исключения для каждого правила.