ClassCastException при вызове TreeSet <Long> .contains (Long.valueOf (someLongValue))
Я в тупике. Я объявляю свой набор таким образом:
private Set<Long> applicationIds;
Затем я заполняю это так:
public void setApplicationIds( Set<Long> applicationIds ) {
this.applicationIds = new TreeSet<Long>( applicationIds );
this.applications = null;
}
Затем я пытаюсь использовать это:
public List<Application> getApplications() {
if ( applications == null ) {
applications = new ArrayList<Application>();
if ( applicationIds != null ) {
for ( Application application : availableApplications ) {
if ( applicationIds.contains( Long.valueOf( application.getId() ) ) ) {
applications.add( application );
}
}
}
}
return applications;
}
И я в конечном итоге с этим:
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
at java.lang.Long.compareTo(Long.java:50)
at java.util.TreeMap.getEntry(TreeMap.java:346)
at java.util.TreeMap.containsKey(TreeMap.java:227)
at java.util.TreeSet.contains(TreeSet.java:234)
at org.mitre.asias.pf.pnp.viewmodel.Subscription.getApplications(Subscription.java:84)
Строка, вызывающая исключение (строка 84 из трассировки стека):
if ( applicationIds.contains( Long.valueOf( application.getId() ) ) ) {
Возможно, я что-то упустил, но если декларацияSet<Long>
и я звонюcontains
метод, передаваемый вLong.valueOf
значение, как я могу получить это исключение?
Это модельный компонент для приложения JSF. Я использую Java 6, Tomcat 6.0.32, mojarra 2.1.14, но ничего из этого не должно иметь значения, так как Generics должен предотвращать такого рода проблемы во время компиляции ...
-------------- РЕДАКТИРОВАТЬ -----------------
Это на самом деле JSF ... Я собрал супер упрощенный пример с этим сеттером:
public void setSelectedValues(Set<Long> selectedValues) {
this.selectedValues = selectedValues;
if (logger.isTraceEnabled()) {
StringBuilder message = new StringBuilder("Selected values:");
for (Object value : selectedValues) {
message.append("\n\t'").append(value.getClass().getName())
.append("': '").append(value.toString()).append("'");
}
logger.trace(message.toString());
}
this.selections = null;
}
привязан к этому компоненту:
<p:selectManyCheckbox id="numbers"
value="#{controller.selectedValues}" layout="pageDirection">
<f:selectItems value="#{controller.availableValues}" />
</p:selectManyCheckbox>
который записывает это в журнал:
15:45:16.887 [http-bio-8080-exec-9] TRACE com.pastdev.learn.debug.Controller - Selected values:
'java.lang.String': '1'
'java.lang.String': '5'
Итак, простой ответ правильный (спасибо @PaulTomblin за то, что вы это подчеркнули). Сеттерявляется звонить сSet
который содержитString
s. Итак, что же является лучшим процессом для преобразования? Нужно ли будет перебирать список, приводя каждое значение к Long?
В качестве примечания я протестировал это на Tomcat 7 с использованием Java 7, и исключение ClassCastException исчезло, однакоcontains
метод всегда возвращаетfalse
как и следовало ожидать.
-------------- РЕДАКТИРОВАТЬ 2 -----------------
Я нашел ответ с правильным способом связать свой компонентВот.
-------------- РЕДАКТИРОВАТЬ 3 -----------------
А такжеВот лучшее объяснение проблемы.