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

Скажем, объявляю переменную:

String a = "test";

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

Ответ 1

a.getClass().getName()

Ответ 2

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

boolean b = a instanceof String

Ответ 3

Я узнал из поисковой системы (мой английский очень плохой, так что код...) Как получить тип переменной? Вверх:

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

Ответ 4

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

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

Решение Martins:

a.getClass().getName()

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

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

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

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

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

Использование обобщений:

public static <T> String nameOf(T o) {
    return o.getClass().getSimpleName();
}

Ответ 5

Использовать функцию перегрузки оператора 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 ...

}

Ответ 6

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

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

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

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

Ответ 7

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

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

Зачем? В 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