Observable — наблюдатель (java.lang.ClassCastException: [Ljava.lang.Object; нельзя привести к ..)

Проблема, с которой я сталкиваюсь, заключается в том, как отделить данные объекта, поступающие от стороннего API notifyObservers of Observable.

Программа основана на шаблоне Observer, и я могу успешно связать Observer со сторонним API Observable, который запускает метод обновления в Observer.

Код: notifyObservers для Observable:

public void newData(String car,String model,CustFeedBack csFeed){
     setChanged();
     notifyObservers(new Object[]{car,model,csFeed});
 }

В методе обновления наблюдателя я пытаюсь привести arg, чтобы я мог получить каждый из 3 данных в объекте, поступающем от nofifyObservers.

@Override
public void update(Observable observable, Object arg) {
        dataSubject = (DataSubject) arg;
        System.out.println(dataSubject.length);
        display();
 }

Я получаю исключение java.lang.ClassCastException: [Ljava.lang.Object; не может быть приведен к... Надеюсь, что проблема, с которой я столкнулся, ясна, и жду указаний о том, как я могу разбить данные объекта на 3 отдельные части.


person iCoder    schedule 04.04.2016    source источник
comment
update вызывается вашим методом notifyObservers, я полагаю? Вы передаете массив объектов этим update методам и пытаетесь преобразовать этот массив в тип. Я думаю, вы должны вместо этого преобразовать его в массив объектов. Должно быть что-то вроде Object[] values = (Object[])arg   -  person Alex    schedule 04.04.2016
comment
@Alex Я тоже пробовал это, но все равно получаю ClassCastException (java.lang.ClassCastException: [Ljava.lang.Object; нельзя привести к [Lpkg1.Model.DataSubject;)   -  person iCoder    schedule 04.04.2016
comment
Что говорит отладчик, когда вы ставите точку останова на рассматриваемой строке (dataSubject = (DataSubject) arg;)? Что содержит arg и какого он типа? Возможно, вы чего-то не ожидаете.   -  person Alex    schedule 04.04.2016
comment
@Alex В отладке я заметил, что arg содержит значения, которые я ожидаю. Не могу понять, что я тут напутал..   -  person iCoder    schedule 04.04.2016
comment
Это звучит странно. Я не знаю размеров вашего проекта, но вы можете рассмотреть возможность извлечения необходимых значений вместо передачи их в методы наблюдателя. Ваш наблюдатель знает Observable (ваш первый аргумент) и может вызывать для него методы для сбора необходимой информации. На самом деле это не решение вашей конкретной проблемы, но вы могли бы обойти это.   -  person Alex    schedule 04.04.2016
comment
@Alex, к сожалению, я не могу внести какие-либо изменения в сторонний API, который предоставляет данные из notifyObserver. Мне придется получать данные с помощью Observer, поскольку он не предоставляет никакого другого механизма для получения информации.   -  person iCoder    schedule 04.04.2016
comment
@Alex Я только что понял, что пропустил [] при попытке использовать опцию Object[]. В любом случае, я не могу отметить первое ваше сообщение как правильный ответ (без вариантов), поэтому я просто проголосовал за комментарий.   -  person iCoder    schedule 04.04.2016


Ответы (1)


Вот мой комментарий в качестве ответа :)

update вызывается вашим методом notifyObservers, я полагаю? Вы передаете массив объектов этим методам обновления и пытаетесь привести этот массив к типу. Я думаю, вы должны вместо этого преобразовать его в массив объектов. Должно быть что-то вроде Object[] values = (Object[])arg

person Alex    schedule 04.04.2016