Как проверить тип переменной в Java? - PullRequest
0 голосов
/ 26 апреля 2018

Я видел много вопросов с похожим названием в StackOverflow, но все эти ответы, похоже, предлагают метод getClass().getSimpleName().Проблема в том, что я не хочу знать тип значения, которое содержит переменная, меня интересует тип самой переменной.В следующем коде я хочу напечатать Object, а не String:

Object ob = "Some String";
System.out.println(ob.getClass().getSimpleName()); // prints "String"

Учитывая, что тип переменной будет супертипом значения, которое она содержит, я могу проверить, еслизначение instanceof некоторый класс.Но instanceof будет возвращать true для всех суперклассов, пока мы не достигнем Object в иерархии.Есть ли способ специально проверить тип переменной?

В производственном коде для этого не может быть практического использования, но знание типа переменной может упростить применение обобщений.Рассмотрим этот метод:

public static <T> void test (T a, T b) {

}

Мы не знаем, какой тип выводит компилятор, когда test вызывается с двумя разными аргументами.Может быть полезно распечатать то, что заменено T.Мы знаем, что T будет заменен наиболее конкретным типом, который оба типа аргументов наследуют при запуске программы.Но если бы я напечатал этот тип, я бы не смог.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Тип локальной переменной доступен только в отладочной информации.

Вы можете;

  • скомпилировать с отладочной информацией.
  • прочитать байт-код дляотладочную информацию и определите, какую именно вы ищете.

ПРИМЕЧАНИЕ. Вы можете увидеть эту информацию в своем отладчике во время выполнения без написания кода.

Однако, намного прощеРешение состоит в том, чтобы написать программу так, чтобы вам не нужно было это знать.например, хранить данные в поле вместо локальной переменной.

0 голосов
/ 26 апреля 2018

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

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

Пока объект существует, все, что имеет значение, это его среда выполнения, конкретный тип (который доступен через obj.getClass()), что-то, что обеспечивает доступ к его иерархии типов.

Для объектов, хранящихся в полях членов класса (при условииВы знаете имя поля), вы можете получить объявленный тип поля:

DeclaringClass.class
    .getDeclaredField("fieldName")
    .getType()
    .getSimpleName();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...