Неожиданное поведение алмазного интерфейса в JDK7 - PullRequest
3 голосов
/ 02 ноября 2011

У меня есть свойство в моем управляемом компоненте JSF:

private List<Long> selectedDataSets;

Я инициализирую список следующим способом:

ArrayList<Long> longList = new ArrayList<>();

Что происходит, я получаю java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long прямо при переходе на этот foreach:

for (Long CRC : selectedDataSets) { ... }

Что очень странно. Отладка показывает, что selectedDataSets полны String значений, но я подумал, что это даже невозможно. Пожалуйста, опишите мне, что именно здесь произошло.

1 Ответ

4 голосов
/ 02 ноября 2011

Очевидно, вы связали свойство с UISelectMany компонентом, таким как <h:selectManyCheckbox> или <selectManyListbox> без явного указания Converter.В Java универсальный тип стирается во время выполнения, а JSF (точнее, EL) вообще ничего не знает о типе универсального списка и по умолчанию String если не указано иное с помощью Converter.Это String, потому что это просто тип значения по умолчанию HttpServletRequest#getParameterMap().EL заполняет список представленными значениями на отражение и не учитывает никаких общих типов.

Так, например, это должно сделать это для вас, с помощью встроенного LongConverter:

<h:selectManyCheckbox value="#{bean.selectedDataSets}" converter="javax.faces.Long">

См. Также:


Обратите внимание, что это не имеет ничего общего с оператором Diamond в Java 7.У вас точно такая же проблема, когда вы экспериментировали с new ArrayList<Long>().

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