2013-12-10 6 views
0

Я получаю ClassCastException в своем коде. Первоначально цель заключалась в том, чтобы преобразовать Set в List, так как метод refreshDetailVOTable получит только Set. Проблема могла заключаться в преобразовании Set в List. refreshDetailVOTable ошибся List вот почему я получаю ClassCastException. Любые мысли по этому поводу?Исключение произошло во время отправки события: java.lang.ClassCastException

public List deleteChildPromotionComponentDetails(ClientContext context, List detailIRsToDelete, 
    String emergencyAccessPermission) throws RetekBusinessException { 

    List exclusionList = null; 
    RpmEvent deleteEvent = buildPromotionComponentDetailsDeleteEvent(emergencyAccessPermission); 
    deleteEvent.setTransitionNotificationExceptionFlag(true); 
    Set detailBOsToDelete = new HashSet(); 

    for (Iterator iDetails = detailIRsToDelete.iterator(); iDetails.hasNext();) { 
     IdentifiableReference detailIR = (IdentifiableReference) iDetails.next(); 

     PromotionComponentDetail promotionComponentDetail = (PromotionComponentDetail) getService() 
         .readForUpdate(detailIR); 
     Set exclusionSet = promotionComponentDetail.getExceptionsAndExclusions(); 

     exclusionList = new ArrayList (exclusionSet); 

     for(Iterator exclusion = exclusionSet.iterator(); exclusion.hasNext();){ 
      PromotionComponentDetail exclusionDel = (PromotionComponentDetail) exclusion.next(); 
      exclusionDel.accept(deleteEvent); 
      detailBOsToDelete.add(promotionComponentDetail); 
     } 

    } 
    return exclusionList; 
} 

public void deleteChildDetails(final List parentComponentDetails) 
{ 
    List list = null; 
    try { 
     list = getCmlPromotionComponentDetailAppService().deleteChildPromotionComponentDetails(
     ClientContext.getInstance(), parentComponentDetails, 
     emergencyPermission.getName()); 
    } catch (RetekBusinessException e) { 
     e.printStackTrace(); 
    } 
    refreshDetailVOTable(list); 
} 
+0

Опубликовать стек из вашей ошибки. – user987339

+0

Вы используете все необработанные типы. Вместо этого используйте дженерики. Они помогут вам найти такую ​​ошибку во время компиляции. –

+0

Я попробую это, в настоящее время я занимаюсь исследованиями дженериков. есть ли у вас какие-либо идеи или образцы того, что нужно разместить в моем коде для его компиляции? thank you @StuartMarks – awesome

ответ

0

Посмотрите на дженериков учебник здесь:

http://docs.oracle.com/javase/tutorial/java/generics/

Вы делаете очень простые вещи, так что вам нужно всего лишь взглянуть на первой части. Вам, вероятно, не нужно нырять в подстановочные знаки.

Предположение относительно того, что происходит: ваш метод принимает параметр List detailIRsToDelete, из которого вы получаете итератор и перебирать элементы, как так:

for (Iterator iDetails = detailIRsToDelete.iterator(); iDetails.hasNext();) { 
    IdentifiableReference detailIR = (IdentifiableReference) iDetails.next(); 
    ... 
} 

Если кто называет вас случайно положить что-то иное, чем IdentifiableReference в detailIRsToDelete, вы получите ClassCastException в инструкции присваивания в цикле. Если вместо параметра списка были объявлены

List<IdentifiableReference> detailIRsToDelete 

акт сдачи вещей в этот список будут проверены компилятором, и произойдет ошибка в точке, где был добавлен ошибочный объект, во время компиляции, а не позже во время выполнения, как вы переживаете.

+0

Спасибо @StuartMarks. Однако я получаю синтаксическую ошибку, в которой указано, что типы параметров доступны только в том случае, если исходный уровень равен 1,5. В настоящее время мы используем 1.4. У нас есть обходное решение? – awesome

+0

Wow, 1.4. Нет, нельзя использовать generics в 1.4. Я собирался предложить использовать «проверенные» обертки коллекции (см. 'Collections.checkedList (list, type)' для проверки во время выполнения, чтобы поймать ошибку, когда элемент неправильного типа помещен в коллекцию. проверенные обертки также были добавлены в 1.5. Возможно, это стимул для вашего проекта для обновления: расширенные функции языка и библиотеки в новых версиях помогут предотвратить такие ошибки. –

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