Как вы знаете тип переменной в Java?

152

Допустим, я объявляю переменную:

String a = "test";

И я хочу знать, какой это тип, то есть вывод должен быть java.lang.StringКак мне это сделать?

Мигель Рибейро
источник
1
Вы действительно интересуетесь типом переменной ? Или вы заботитесь о типе значения ? Поскольку тип переменной не может быть легко получен (фактически это вообще невозможно для локальных переменных и требует отражения для полей).
Иоахим Зауэр
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 - это разница между типом времени компиляции (статический) и типом времени исполнения (динамический).
Бен Линс

Ответы:

269
a.getClass().getName()
Мартин
источник
16
Это даст тип значения. не обязательно тип переменной.
Иоахим Зауэр
7
Я просто подумал, что это именно то, что OP действительно ищет, так как объявление aдовольно очевидно во время компиляции
Martin
4
Это сработало бы, если типы не являются примитивами ... Если тип int, как узнать тип?
Мигель Рибейро
5
@Miguel: поскольку единственный способ обработать intзначение - это intпеременная, нет способа написать код, который обрабатывает intзначение и не знает этого типа. Дело обстоит иначе, если вы работаете с оболочкой Integer, но код этого ответа снова работает.
Иоахим Зауэр
1
это не верно для примитивного типа.
Мехди
37

Если вы хотите имя, используйте метод Мартина. Если вы хотите знать, является ли это экземпляром определенного класса:

boolean b = a instanceof String

Мартин Конечни
источник
15
ты тоже не Мартин? :)
seokhoonlee
Другой Мартин ... LOL;)
chankruze
Этот код Double a = 1d; boolean b = a instanceof String;вызовет ошибкуerror: incompatible types: Double cannot be converted to String
Alex78191
35

Я хотел бы расширить ответ Мартина там ...

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

Мартинс Решение:

a.getClass().getName()

Однако, если вы хотите, чтобы он работал с чем-либо, вы можете сделать это:

((Object) myVar).getClass().getName()
//OR
((Object) myInt).getClass().getSimpleName()

В этом случае примитив будет просто завернут в оболочку. Вы получите Объект примитива в этом случае.

Я сам использовал это так:

private static String nameOf(Object o) {
    return o.getClass().getSimpleName();
}

Используя Generics:

public static <T> String nameOf(T o) {
    return o.getClass().getSimpleName();
}
Atspulgs
источник
Интересный. Я только что попробовал ваш код на: 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
Копировать вставить
источник
3

Я согласен с тем, что сказал Йоахим Зауэр, и это невозможно узнать (тип переменной! Не тип значения!), Если только ваша переменная не является атрибутом класса (и вам придется извлекать поля класса, получить правильное поле по имени ...)

На самом деле для меня совершенно невозможно, чтобы какой-либо a.xxx().yyy()метод дал вам правильный ответ, поскольку ответ был бы разным для одного и того же объекта в соответствии с контекстом, в котором вы вызываете этот метод ...

Как сказал teehoo, если вы знаете при компиляции определенный список типов для тестирования, вы можете использовать instanceof, но вы также получите подклассы, возвращающие true ...

Одним из возможных решений будет также вдохновить себя реализацией java.lang.reflect.Fieldи создать свой собственный Fieldкласс, а затем объявить все свои локальные переменные в качестве этой пользовательской Fieldреализации ... но вам лучше найти другое решение, мне действительно интересно, зачем вам нужна переменная тип, а не только тип значения?

Себастьян Лорбер
источник
Для «но вы также получите подклассы, возвращающие true ...» , я думаю, вы имели в виду «но вы также получите родительские классы, возвращающие true ...» , верно?
Скомиса
3

Использовать функцию перегрузки операторов в Java

class Test {

    void printType(String x) {
        System.out.print("String");
    }

    void printType(int x) {     
        System.out.print("Int");
    }

    // same goes on with boolean,double,float,object ...

}
epicwhat001
источник
8
В Java нет концепции перегрузки операторов, это перегрузка методов
nicoschl
2

Я думаю, что у нас есть несколько решений здесь:

  • Примером может быть решение.

Зачем? В Java каждый класс наследуется от самого класса Object. Так что если у вас есть переменная, и вы хотели бы знать ее тип. Ты можешь использовать

  • System.out.println (((объекта) е) .getClass () GetName ().);

или

  • Integer.class.isInstance (1985); // дает истину

или

  • isPrimitive ()

    public static void main(String[] args) {
    
     ClassDemo classOne = new ClassDemo();
     Class classOneClass = classOne();
    
     int i = 5;
     Class iClass = int.class;
    
     // checking for primitive type
     boolean retval1 = classOneClass.isPrimitive();
     System.out.println("classOneClass is primitive type? = " + retval1);
    
     // checking for primitive type?
     boolean retval2 = iClass.isPrimitive();
     System.out.println("iClass is primitive type? = " + retval2);
    }

Это даст нам:

  1. ЛОЖНЫЙ
  2. ПРАВДА

Узнайте больше здесь: Как определить примитивный тип примитивной переменной?

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

Кара
источник