林难倒。 我正是如此宣告我的设置:
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应用程序模型bean。 我使用Java 6中,Tomcat的6.0.32,钻嘴鱼科2.1.14,但没有应真正重要的泛型应该防止这类问题的编译时间...
--------------编辑-----------------
它实际上是JSF ......我扔在一起,一个超级简单的例子与此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;
}
绑定到该组件:
<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
秒。 所以,现在,什么是转换的最佳工艺? 我需要通过列表铸造每个值的长迭代?
作为一个方面说明,我测试了这个在Tomcat 7使用Java 7和ClassCastException异常就走了,但是, contains
方法总是返回false
的应该可以预期的。
-------------- EDIT 2 -----------------
我发现我的组件绑定正确的方式回答这里 。
--------------编辑3 -----------------
而这里是问题的一个更好的解释。