ClassCastException podczas wywoływania TreeSet <Long> .contains (Long.valueOf (someLongValue))

Jestem zakłopotany. Oświadczam więc, że mój set:

    private Set<Long> applicationIds;

Następnie wypełniam to w ten sposób:

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

Następnie próbuję go użyć:

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

I kończę na tym:

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)

Linia powodująca wyjątek (linia 84 ze śladu stosu) to ta:

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

Może czegoś mi brakuje, ale jeśli deklaracja jestSet<Long> i dzwonię docontains metoda przechodząca w aLong.valueOf wartość, jak mogę uzyskać ten wyjątek?

Jest to komponent bean modelu dla aplikacji JSF. Używam Java 6, Tomcat 6.0.32, mojarra 2.1.14, ale żadna z tych rzeczy nie powinna mieć znaczenia, ponieważ Generics mają zapobiegać tego rodzaju problemom z czasem kompilacji ...

-------------- EDYTOWAĆ -----------------

Właściwie to JSF ... Połączyłem super uproszczony przykład z tym seterem:

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

związany z tym komponentem:

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

który zapisuje to do dziennika:

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'

Tak więc prosta odpowiedź jest poprawna (dziękuję @ PaulTomblin za podkreślenie tego). Seterjest wywoływanie za pomocąSet to zawieraStrings. Więc jaki jest najlepszy proces konwersji? Czy muszę przeglądać listę, nadając każdej wartości wartość Long?

Na marginesie, przetestowałem to na Tomcat 7, używając Java 7, ale ClassCastException odszedł, jednakcontains metoda zawsze wracafalse jak należy się spodziewać.

-------------- EDYCJA 2 -----------------

Znalazłem odpowiedź z właściwym sposobem powiązania mojego komponentututaj.

-------------- EDYCJA 3 -----------------

Itutaj jest lepszym wyjaśnieniem problemu.

questionAnswers(2)

yourAnswerToTheQuestion