2012-03-01 6 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); 
} 

по этой линии

Integer grandChildCount = (Integer) result[1]; 

Есть ли у кого-нибудь идеи?

+0

Спасибо всем, я пробую его сейчас в производстве, надеюсь, он работает сейчас. –

ответ

25

Вы можете использовать:

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

Или, может быть приведен к Number, чтобы охватить как Integer и BigInteger значения.

+4

. '.' связывает более жесткие, чем литые, поэтому результат' ((BigInteger) [1]). Предположим, что intValue() 'будет предпочтительнее. –

+0

@RayToal - Хорошая добыча. –

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 

И это причина, почему литье из BigInteger в Integer невозможно.

Литье Java-примитивов будет выполнять некоторую конверсию (например, отливку от double до int), в то время как литье типов никогда не преобразует классы.

+0

Я был сбит с толку, потому что локальная база данных была сгенерирована с помощью Integer по спячке, и то же самое произошло с производством, но оно было изменено на int в процессе производства. –

Смежные вопросы