2012-03-01 10 views
9

次の例外が発生します。次のコード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); 
} 
でjava.math.BigIntegerのは にキャストすることはできませんjava.lang.Integerの

とjava.lang.ClassCastException:によって引き起こさ

このラインの

Integer grandChildCount = (Integer) result[1]; 

誰にも分かりませんか?

+0

ありがとうございました。私は今、生産中に試しています。うまくいけば今すぐ動作します。 –

答えて

25

あなたが使用することができます。

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

それとも両方IntegerBigInteger値をカバーするためにNumberにキャスト。

+4

'.'はキャストよりも結びつくので、'((BigInteger)result [1])。intValue() 'が優先されます。 –

+0

@RayToal - 良いキャッチ。 –

1

データベースの列はおそらくDECIMALです。 IntegerではなくBigIntegerとして処理してください。それ以外の場合は数字が失われています。または、列をintに変更します。

3

java.lang.Integerは、BigIntegerのスーパークラスではありません。 BigIntegerIntegerの両方がjava.lang.Numberから継承されるため、java.lang.Numberにキャストできます。

我々はJavadocのから見たようBigIntegerIntegerのサブクラスではありませんが、Javaのドキュメントhttp://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Number.html

8

を参照してください:

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

そして、それがBigIntegerからIntegerに鋳造が不可能である理由です。

Javaプリミティブのキャストは、キャストのタイプがクラスを変換することはありませんが、(doubleからintへのキャストのような)変換を行います。

+0

ローカルデータベースが休止状態でIntegerで生成され、同じことが生産で発生するはずですが、生産現場でintに変更されたので、私は混乱しました。 –

関連する問題