Как я могу сравнить классы, используя отражение? - PullRequest
9 голосов
/ 05 мая 2009

Я пытаюсь определить тип класса класса с помощью отражения, а затем сделать что-то конкретное. Например, если класс double, используйте двойной специфический метод.

Я пытаюсь использовать


  if(f.getClass() == Double.class)

Однако я получаю сообщение об ошибке компилятора:

"Несовместимые типы операндов Class и Class "

Как правильно это сделать?

Редактировать: чтобы быть более понятным

f относится к типу Field. получено отражением в петле


  (Field f : instance.getDeclaredFields())

Ответы [ 5 ]

7 голосов
/ 05 мая 2009

Интересное сообщение об ошибке (я не знал, что оператор '==' проверит это). Но, основываясь на этом, я подозреваю, что ваше сравнение неверно: вы пытаетесь увидеть, является ли класс Field (теоретически его суперкласс, но только в теории - Field является окончательным) тем же, что и Double.class, что не может .

Итак: да, сравнение должно работать, если вы дадите правильные аргументы. Поэтому я подозреваю, что вы хотите сделать:

if (f.getType () == Double.class)

вместо этого. И это должно сработать, учитывая, что Double - последний класс. В противном случае «isAssignableFrom» будет более подходящим.

3 голосов
/ 05 мая 2009

Если у вас есть объекты, используйте

if (f instanceof Double) { }

Еще одна интересная вещь - метод isAssignableFrom:

if (f.getClass().isAssignableFrom (Double.class)) { }

Но в целом это плохой стиль. Используйте полиморфизм для реализации логики, которая зависит от типов классов.


Ответ на комментарий: f instanceof Double отлично работает.

Вы, вероятно, написали что-то вроде этого:

float f = 1.1f;
if (f instanceof Double) { ..}

И умный компилятор Java говорит, что у вас есть CE. НО:

public static boolean isInstanceOfDouble (Object obj) {
   return obj instanceof Double;
}

psvm (String [] args) {
   sout (isInstanceOfDouble (1.1f);
}

.. это отлично работает

1 голос
/ 05 мая 2009

Вы должны использовать getType (), чтобы получить базовый тип, а не получить класс. getType () возвращает требуемый класс базового типа.

код выглядит так:


  if(f.getType().equals(Double.class))
1 голос
/ 05 мая 2009

Самый простой способ будет

if (f.getClass().equals(Double.class))

Редактировать: Ах, теперь я вижу проблему. Вы получили ошибку, потому что (в результате обобщений) компилятор мог сказать, что классы никогда не будут равны (Field.class не может быть равен Double.class). Использование .equals () превращает его в предупреждение вместо ошибки, но это все равно неправильный код.

Field.getType() дает вам тип поля. Поскольку это не может быть известно во время компиляции, вы не получите сообщение об ошибке, если вы используете оператор ==, как вы делали это изначально.

0 голосов
/ 29 апреля 2014

Следующий фрагмент кода должен работать отлично:

if (f.getType() == Double.TYPE)

Кстати, ни ==, ни equals не работают для Число типов в соответствии с моим тестом (JRE7)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...