Вы действительно интересуетесь типом переменной ? Или вы заботитесь о типе значения ? Поскольку тип переменной не может быть легко получен (фактически это вообще невозможно для локальных переменных и требует отражения для полей).
Иоахим Зауэр
8
@Paul: Учтите Object o = "o";- тип переменной - Object, тип значения - String.
Майкл Боргвардт
2
@Paul В List<String> l = new ArrayList<String>();, тип переменной List<String>, тип значения ArrayList<String>.
Бен Линс
1
@Ben Lings Тип переменной - java.util.ArrayList, а тип значения - java.util.ArrayList.
Аджай Такур
1
@AjayThakur - это разница между типом времени компиляции (статический) и типом времени исполнения (динамический).
Это даст тип значения. не обязательно тип переменной.
Иоахим Зауэр
7
Я просто подумал, что это именно то, что OP действительно ищет, так как объявление aдовольно очевидно во время компиляции
Martin
4
Это сработало бы, если типы не являются примитивами ... Если тип int, как узнать тип?
Мигель Рибейро
5
@Miguel: поскольку единственный способ обработать intзначение - это intпеременная, нет способа написать код, который обрабатывает intзначение и не знает этого типа. Дело обстоит иначе, если вы работаете с оболочкой Integer, но код этого ответа снова работает.
Иоахим Зауэр
1
это не верно для примитивного типа.
Мехди
37
Если вы хотите имя, используйте метод Мартина. Если вы хотите знать, является ли это экземпляром определенного класса:
Этот код Double a = 1d; boolean b = a instanceof String;вызовет ошибкуerror: incompatible types: Double cannot be converted to String
Alex78191
35
Я хотел бы расширить ответ Мартина там ...
Его решение довольно хорошее, но его можно настроить так, чтобы можно было напечатать любой «тип переменной» (на самом деле это тип значения, подробнее по теме ). Тем не менее, «твик» может быть сильным словом для этого. В любом случае, это может быть полезно.
Мартинс Решение:
a.getClass().getName()
Однако, если вы хотите, чтобы он работал с чем-либо, вы можете сделать это:
Интересный. Я только что попробовал ваш код на: System.out.println (((Object) Integer.parseInt ("12")) .getClass (). GetSimpleName ()); и это работает! \ o /
Шев
31
Я узнал из поисковой системы (мой английский очень плохой, так что код ...) Как узнать тип переменной? UPS :
String str ="test";String type = str.getClass().getName();
value: type = java.lang.String
Этот метод :
str.getClass().getSimpleName();
value:String
теперь пример:
Object o =1;
o.getClass().getSimpleName();
value:Integer
Я согласен с тем, что сказал Йоахим Зауэр, и это невозможно узнать (тип переменной! Не тип значения!), Если только ваша переменная не является атрибутом класса (и вам придется извлекать поля класса, получить правильное поле по имени ...)
На самом деле для меня совершенно невозможно, чтобы какой-либо a.xxx().yyy()метод дал вам правильный ответ, поскольку ответ был бы разным для одного и того же объекта в соответствии с контекстом, в котором вы вызываете этот метод ...
Как сказал teehoo, если вы знаете при компиляции определенный список типов для тестирования, вы можете использовать instanceof, но вы также получите подклассы, возвращающие true ...
Одним из возможных решений будет также вдохновить себя реализацией java.lang.reflect.Fieldи создать свой собственный Fieldкласс, а затем объявить все свои локальные переменные в качестве этой пользовательской Fieldреализации ... но вам лучше найти другое решение, мне действительно интересно, зачем вам нужна переменная тип, а не только тип значения?
Для «но вы также получите подклассы, возвращающие true ...» , я думаю, вы имели в виду «но вы также получите родительские классы, возвращающие true ...» , верно?
Скомиса
3
Использовать функцию перегрузки операторов в Java
classTest{void printType(String x){System.out.print("String");}void printType(int x){System.out.print("Int");}// same goes on with boolean,double,float,object ...}
В Java нет концепции перегрузки операторов, это перегрузка методов
nicoschl
2
Я думаю, что у нас есть несколько решений здесь:
Примером может быть решение.
Зачем? В Java каждый класс наследуется от самого класса Object. Так что если у вас есть переменная, и вы хотели бы знать ее тип. Ты можешь использовать
Object o = "o";
- тип переменной - Object, тип значения - String.List<String> l = new ArrayList<String>();
, тип переменнойList<String>
, тип значенияArrayList<String>
.Ответы:
источник
a
довольно очевидно во время компиляцииint
значение - этоint
переменная, нет способа написать код, который обрабатываетint
значение и не знает этого типа. Дело обстоит иначе, если вы работаете с оболочкойInteger
, но код этого ответа снова работает.Если вы хотите имя, используйте метод Мартина. Если вы хотите знать, является ли это экземпляром определенного класса:
boolean b = a instanceof String
источник
Double a = 1d; boolean b = a instanceof String;
вызовет ошибкуerror: incompatible types: Double cannot be converted to String
Я хотел бы расширить ответ Мартина там ...
Его решение довольно хорошее, но его можно настроить так, чтобы можно было напечатать любой «тип переменной» (на самом деле это тип значения, подробнее по теме ). Тем не менее, «твик» может быть сильным словом для этого. В любом случае, это может быть полезно.
Мартинс Решение:
Однако, если вы хотите, чтобы он работал с чем-либо, вы можете сделать это:
В этом случае примитив будет просто завернут в оболочку. Вы получите Объект примитива в этом случае.
Я сам использовал это так:
Используя Generics:
источник
Я узнал из поисковой системы (мой английский очень плохой, так что код ...) Как узнать тип переменной? UPS :
Этот метод :
теперь пример:
источник
Я согласен с тем, что сказал Йоахим Зауэр, и это невозможно узнать (тип переменной! Не тип значения!), Если только ваша переменная не является атрибутом класса (и вам придется извлекать поля класса, получить правильное поле по имени ...)
На самом деле для меня совершенно невозможно, чтобы какой-либо
a.xxx().yyy()
метод дал вам правильный ответ, поскольку ответ был бы разным для одного и того же объекта в соответствии с контекстом, в котором вы вызываете этот метод ...Как сказал teehoo, если вы знаете при компиляции определенный список типов для тестирования, вы можете использовать instanceof, но вы также получите подклассы, возвращающие true ...
Одним из возможных решений будет также вдохновить себя реализацией
java.lang.reflect.Field
и создать свой собственныйField
класс, а затем объявить все свои локальные переменные в качестве этой пользовательскойField
реализации ... но вам лучше найти другое решение, мне действительно интересно, зачем вам нужна переменная тип, а не только тип значения?источник
Использовать функцию перегрузки операторов в Java
источник
Я думаю, что у нас есть несколько решений здесь:
Зачем? В Java каждый класс наследуется от самого класса Object. Так что если у вас есть переменная, и вы хотели бы знать ее тип. Ты можешь использовать
или
или
isPrimitive ()
Это даст нам:
Узнайте больше здесь: Как определить примитивный тип примитивной переменной?
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
http://docs.oracle.com/cd/E26806_01/wlp.1034/e14255/com/bea/p13n/expression/operator/Instanceof.html
источник