Как я могу автоматически привести ссылку Object на тип экземпляра? - PullRequest
1 голос
/ 02 декабря 2010

Я использую JCR API, который использует перегрузку методов следующим образом:

setProperty(String value)
setProperty(Boolean value)
setProperty(Integer value)
...

У меня тогда есть Collection<Object>, который может содержать String, Boolean, Integer и т. Д..

Я хотел бы перебрать эту коллекцию, передав каждый элемент правильной реализации setProperty для этого типа экземпляра.Очевидный путь - что-то вроде этого:

for (Object value : values) {
   if (value instanceof String) node.setProperty((String) value);
   if (value instanceof Boolean) node.setProperty((Boolean) value);
   if (value instanceof Integer) node.setProperty((Integer) value);
   ...
}

Теперь, помимо того, что уродлив - и отклоняется от идеалов ОО - это решение просто не масштабируется.Хотя он работает для этого конкретного случая, он быстро станет громоздким по мере роста числа типов.

Я действительно чувствую, что должен быть какой-то элегантный прием или утилита для автоматического выполнения этой операции приведения.

Ответы [ 2 ]

3 голосов
/ 02 декабря 2010

Нет, нет - потому что вы запрашиваете разрешение перегрузки , которое обычно выполняется во время компиляции, а не во время выполнения.

Параметры:

  • Используйте отражение, чтобы найти и выполнить метод
  • Используйте шаблон посетителя для эмуляции двойная отправка (это может не подходить для вашего случая; мне не нравится шаблон посетителя, как многим другим)
0 голосов
/ 02 декабря 2010

Я действительно чувствую, что должен быть какой-то элегантный прием или утилита для автоматического выполнения этой операции приведения.

Не думаю, что вы найдете такой.

Если у вас было большое количество альтернатив типа (то есть 20 или более), возможно, имеет смысл выполнить поиск по хеш-таблице на value.getClass(), чтобы получить экземпляр некоторого объекта "установщика".Но вам нужно написать много стандартного кода ... так что это не считается элегантным, IMO.

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

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