当前位置: 首页 > 面试题库 >

调用TreeSet时发生ClassCastException.contains(Long.valueOf(someLongValue))

景光赫
2023-03-14
问题内容

我很沮丧 我这样宣布我的集合:

    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,mojarra
2.1.14,但是这些都不应该真正重要,因为泛型应该防止这种问题的编译时间…

--------------编辑-----------------

它实际上是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强调这一点)。setter方法
获取调用一个Set包含String秒。那么,现在最好的转换过程是什么?我是否需要遍历将每个值都转换为Long的列表?

附带说明一下,我使用Java 7在Tomcat
7上对此进行了测试,但ClassCastException消失了,但是,该contains方法总是false按预期返回。

--------------编辑2 -----------------

我发现我的组件绑定正确的方式回答这里。

--------------编辑3 -----------------

而这里是问题的一个更好的解释。


问题答案:

也许我缺少了一些东西,但是如果声明为Set,并且我正在调用传递一个Long.valueOf值的contains方法,那么该如何获取此异常?

请注意,在Java中,泛型类型注释仅是编译器的提示,在运行时不起作用,因此有可能在运行时违反这些约束(但在某处会出现编译器警告)。

看起来您Set<Long>实际上包含至少一个String。那套东西从哪里来?

因为泛型应该防止这种问题的编译时间

是的,您的代码中应该有一个警告,指出缺少通用类型或未经检查的强制类型转换。这只是一个警告,因为泛型是可选的。在您确实使用过的地方,那将是一个错误。



 类似资料:
  • 问题内容: 我想这是某种依赖性问题,所以这是我的树: 从我发现的情况来看,Spring 4.1.1应该可以与javax.servlet 3.1.0一起使用,但是 我 在调用response.getStatus( ) 时遇到了 java.lang.NoSuchMethodError:javax.servlet.http.HttpServletResponse.getStatus() )放在我的拦截器

  • 问题内容: 我在Java中为程序使用多线程。我已经成功运行了线程,但是当我使用线程时,它正在抛出。如何使线程等待通知它? 问题答案: 你需要先行一步才能工作。 另外,我建议你查看并发程序包,而不是旧式的线程程序包。它们更安全,更易于使用。 快乐的编码。 编辑 我以为你的意思是,当你尝试在不持有对象锁定的情况下获取访问权限时会发生异常。

  • 问题内容: 我有在Android上运行良好的代码。当我将其移植到具有JRE 1.6的Windows 64位计算机上时,该代码不起作用。 当我运行以下代码行时: 我得到以下异常: java.security.NoSuchAlgorithmException:SHA256 MessageDigest在java.security.MessageDigest.getInstance(未知源)处的java.

  • 我是Spring的新手。我正在使用SpringWebMVC开发RESTAPI。对于错误处理,我得到了这个链接http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann rest spring mvc异常 我曾尝试在我的项目中使用ResponseEntityExceptionHand

  • 问题内容: 我们正在尝试从EC2实例上运行的Java程序的Amazon SQS队列中读取数据。有时,我们得到一个。我们的代码如下所示: 我们的堆栈跟踪如下所示: 的文档没有告诉我们期望AbortedException。 我们正在使用SDK版本1.11.77。 任何帮助,将不胜感激。谢谢。 问题答案: 尽管on上的javadoc 稀疏,但它是&的子类(不必声明)。另外,AWS Exception处理

  • 在调用ANT目标时,我得到以下错误。我尽了最大的努力来解决这个问题,但没有。 [junitreport]正在处理D:\checkouts\guiinstaller\tests-capsinstallertest-suites.xml到D:\checkouts\guiunit.build.junit.report\junit-nof[junitreport]加载样式表jar:file:/d:/che