Как я сравниваю классы с помощью отражения?

Вам необходимо добавить новую кнопку в качестве подпредставления в классе представления вашего ViewController, чтобы она отображалась в пользовательском интерфейсе.

func addNewButton(title: String)
{
  let butt: UIButton = UIButton()
..
..
  self.view.addSubview(butt)
}
9
задан kgrad 5 May 2009 в 16:28
поделиться

4 ответа

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

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

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

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

7
ответ дан 4 December 2019 в 19:36
поделиться

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

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

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

3
ответ дан 4 December 2019 в 19:36
поделиться

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

код выглядит следующим образом:


  if(f.getType().equals(Double.class))
1
ответ дан 4 December 2019 в 19:36
поделиться

Простейшим способом было бы

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

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

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

1
ответ дан 4 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: