Як ви знаєте тип змінної в java?


152

Скажімо, я оголошую змінну:

String a = "test";

І я хочу знати, що це за тип, тобто вихід повинен бути. java.lang.StringЯк це зробити?


1
Вас дійсно цікавить тип змінної ? Або ви дбаєте про тип значення ? Оскільки тип змінної неможливо легко отримати (насправді це зовсім не можливо для локальних змінних і вимагає відображення для полів).
Йоахім Зауер

8
@Paul: Поміркуйте Object o = "o";- тип змінної - Object, тип значення - String.
Майкл Боргвардт

2
@Paul In 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
Я просто подумав, що саме цього дійсно шукала ОП, оскільки декларація aє досить очевидною на час збирання
Мартін

4
Це спрацювало б, якщо типи не є примітивними ... Якщо тип int, як знати тип?
Мігель Рібейро

5
@Miguel: оскільки єдиний спосіб обробити intзначення - це intзмінна, немає способу писати код, який обробляє intзначення і не знає цього типу. Справа в іншому випадку, якщо ви обробляєте подібну обгортку Integer, але тоді код цієї відповіді працює знову.
Йоахім Зауер

1
це не вірно для примітивного типу.
Мехді

37

Якщо ви хочете ім'я, використовуйте метод Мартіна. Якщо ви хочете знати, чи це екземпляр певного класу:

boolean b = a instanceof String


15
чи ти теж не Мартін? :)
seokhoonlee

Інший Мартін ... ЛОЛ;)
чанкрузе

Точний код Double a = 1d; boolean b = a instanceof String;спричинить помилкуerror: incompatible types: Double cannot be converted to String
Alex78191

35

Я хотів би розкрити відповідь Мартіна там ...

Його рішення є досить приємним, але його можна налаштувати, тому будь-який "змінний тип" можна надрукувати таким чином. (Це фактично Value Type, докладніше про тему ). Це сказало, що "переопрацьоване" може бути сильним словом для цього. Незалежно, це може бути корисним.

Рішення Мартінса:

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();
}

Цікаво. Я щойно спробував ваш код на: System.out.println (((Object) Integer.parseInt ("12")) .getClass (). GetSimpleName ()); і це працює! \ o /
shevy

31

Я дізнався з пошукової системи (моя англійська дуже погана, так що код ...) Як отримати тип змінної? Вгору:

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, але ви також отримаєте підкласи, що повертаються справжніми ...

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


Для "але ви також отримаєте підкласи, що повертаються справжніми ..." , я думаю, ви мали на увазі "але ви також отримаєте батьківські класи, що повертаються істинними ..." , правда?
skomisa

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 ...

}

8
У Java немає концепції перевантаження оператора, це метод перевантаження
nicoschl

2

Я думаю, що у нас є кілька рішень:

  • Приклад може бути рішенням.

Чому? У Java кожен клас успадковується від самого класу Object. Тож якщо у вас є змінна і ви хочете дізнатися її тип. Можна використовувати

  • System.out.println (((Object) f) .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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.