ClassCastException al llamar a TreeSet <Long> .contains (Long.valueOf (someLongValue))

Estoy perplejo. Declaro mi conjunto así:

    private Set<Long> applicationIds;

Entonces lo poblo así:

public void setApplicationIds( Set<Long> applicationIds ) {
    this.applicationIds = new TreeSet<Long>( applicationIds );
    this.applications = null;
}

Entonces trato de usarlo:

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

Y termino con esto:

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)

La línea que causa la excepción (línea 84 de la traza de pila) es esta:

                if ( applicationIds.contains( Long.valueOf( application.getId() ) ) ) {

Tal vez me esté faltando algo, pero si la declaración esSet<Long> y estoy llamando a lacontains método que pasa en unLong.valueOf Valor, ¿cómo puedo obtener esta excepción?

Este es un modelo de bean para una aplicación JSF. Estoy usando Java 6, Tomcat 6.0.32, mojarra 2.1.14, pero nada de eso debería importar, ya que los Genéricos deben evitar este tipo de problemas en el tiempo de compilación ...

-------------- EDIT -----------------

De hecho, es el JSF ... Junté un ejemplo súper simplificado con este setter:

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

ligado a este componente:

<p:selectManyCheckbox id="numbers"
   value="#{controller.selectedValues}" layout="pageDirection">
  <f:selectItems value="#{controller.availableValues}" />
</p:selectManyCheckbox>

que escribe esto en el registro:

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'

Entonces, la respuesta simple es la correcta (gracias @PaulTomblin por enfatizar esto). El compositores ser llamado con unSet eso contieneStrings. Entonces, ¿cuál es el mejor proceso para la conversión? ¿Tendré que recorrer la lista para convertir cada valor en un valor Long?

Como nota al margen, probé esto en Tomcat 7 usando Java 7 y la excepción ClassCastException desapareció, sin embargo, elcontains método siempre devuelvefalse como debe esperarse.

-------------- EDIT 2 -----------------

Encontré una respuesta con la forma correcta de enlazar mi componente.aquí.

-------------- EDIT 3 -----------------

Yaquí Es una mejor explicación del problema.

Respuestas a la pregunta(2)

Su respuesta a la pregunta