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 который содержитStrings. Итак, что же является лучшим процессом для преобразования? Нужно ли будет перебирать список, приводя каждое значение к Long?

В качестве примечания я протестировал это на Tomcat 7 с использованием Java 7, и исключение ClassCastException исчезло, однакоcontains метод всегда возвращаетfalse как и следовало ожидать.

-------------- РЕДАКТИРОВАТЬ 2 -----------------

Я нашел ответ с правильным способом связать свой компонентВот.

-------------- РЕДАКТИРОВАТЬ 3 -----------------

А такжеВот лучшее объяснение проблемы.

Ответы на вопрос(2)

Ваш ответ на вопрос