如果未首先分配给Number,Integer.longValue()会抛出异常

kai*_*kai 2 java jpa eclipselink

public Long getId()
{
    Some code ...

    TypedQuery<Long> query = entityManager.createQuery(sQuery, Long.class);
    return query.getSingleResult();
}
Run Code Online (Sandbox Code Playgroud)

从这个代码,我收到了ClassCastExceptionIntegerLong.我检查query.getSingleResult();了调试器并且我认可了Integer5.

如果我将代码更改为query.getSingleResult().longValue();它仍然无法正常工作.我得到了同样的例外.但如果我使用

Number tmp = query.getSingleResult();
return tmp.longValue();
Run Code Online (Sandbox Code Playgroud)

有用.我的问题是为什么第一个解决方案不起作用?Surley我可以改变我的查询,但我只想知道为什么secound有效而第一个没有.

随意更改我的问题的标题.提前致谢!

wer*_*ero 7

您的查询实际上返回了一个,Integer但您假装它Long通过调用返回a entityManager.createQuery(sQuery, Long.class).

现在当你执行

query.getSingleResult()
query.getSingleResult().longValue()
Run Code Online (Sandbox Code Playgroud)

由于您的泛型声明,编译器会将强制转换插入到Long中.因此这实际上是执行的:

(Long)query.getSingleResult()
((Long)query.getSingleResult()).longValue()
Run Code Online (Sandbox Code Playgroud)

并且ClassCastException被抛出,因为Integer不是Long.

你打电话的时候

Number tmp = query.getSingleResult();
Run Code Online (Sandbox Code Playgroud)

它实际上执行

Number tmp = (Number)query.getSingleResult();
Run Code Online (Sandbox Code Playgroud)

这个代码成功了,因为IntegerNumber.

所以不是longValue()抛出异常而是抛出之前的演员.

  • @rajuGT`query.getSingleResult().longValue()`也编译成`((Long)query.getSingleResult()).longValue()` (2认同)