2012-03-01 45 views
9

我收到以下异常。java.math.BigInteger不能转换为java.lang.Integer

所致:

java.lang.ClassCastException:java.math.BigInteger中不能转换到 java.lang.Integer中

用下面的代码

List queryResult = query.list(); 

for (Iterator<Object[]> it = queryResult.iterator(); it.hasNext();) { 
    Object[] result = it.next(); 
    Integer childId = (Integer) result[0]; 
    Integer grandChildCount = (Integer) result[1]; 
    CompanyNode childNode = childNodes.get(childId); 
    childNode.setHasChildren(grandChildCount != 0); 
    childNode.setIsLeaf(grandChildCount == 0); 
} 

at this line

Integer grandChildCount = (Integer) result[1]; 

有人有什么想法吗?

+0

谢谢大家,我现在在生产中试用它,希望它现在可以工作。 – 2012-03-01 05:34:30

回答

25

您可以使用:

Integer grandChildCount = ((BigInteger) result[1]).intValue(); 

或许投给Number既包括IntegerBigInteger值。

+4

'.'绑定比cast更紧密,所以'((BigInteger)result [1])。intValue()'会是首选,我想。 – 2012-03-01 05:21:36

+0

@RayToal - 好。 – 2012-03-01 05:47:04

1

数据库中的列可能是DECIMAL。您应该将其作为BigInteger进行处理,而不是Integer,否则您会丢失数字。或者将列更改为int

8

当我们从JavaDoc中看到,BigInteger不是Integer一个子类:

java.lang.Object      java.lang.Object 
    java.lang.Number      java.lang.Number 
     java.math.BigInteger     java.lang.Integer 

这就是为什么从铸造到BigIntegerInteger不可能的原因。

Java基元的投射将进行一些转换(如从double投射到int),而投射类型将永远不会转换类。

+0

我很困惑,因为本地数据库是通过休眠生成的一个Integer数据库,生产过程中应该发生同样的情况,但它在生产中已更改为int。 – 2012-03-01 05:53:36

相关问题