web-dev-qa-db-ja.com

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);
}

この行で

Integer grandChildCount = (Integer) result[1];

誰にもアイデアはありますか?

14
Code Junkie

次を使用できます。

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

または、NumberIntegerの両方の値をカバーするために、BigIntegerにキャストすることもできます。

41
Ted Hopp

JavaDocからわかるように、BigIntegerIntegerのサブクラスではありません。

Java.lang.Object                      Java.lang.Object
   Java.lang.Number                       Java.lang.Number
      Java.math.BigInteger                    Java.lang.Integer

そして、それがBigIntegerからIntegerへのキャストが不可能な理由です。

Javaプリミティブのキャストは、doubleからintへのキャストなど)何らかの変換を行いますが、型のキャストはクラスを変換しません。

11
Andreas_D

Java.lang.IntegerBigIntegerのスーパークラスではありません。 BigIntegerIntegerは両方ともJava.lang.Numberから継承するため、Java.lang.Numberにキャストできます。

Java docs http://docs.Oracle.com/javase/1.5.0/docs/api/Java/lang/Number.html を参照してください。

4
btantlinger

データベースの列はおそらくDECIMALです。 BigIntegerではなくIntegerとして処理する必要があります。そうしないと、桁が失われます。または、列をintに変更します。

1
user207421

これを試すことができます:

((BigDecimal) volume).intValue();

私が使う Java.math.BigDecimalint(プリミティブ型)に変換します。

それは私のために働いています。

0
Võ Hoài Danh