Даункинг исключение

Я сделал этот код:

protected Lala lala;
private Oyeha oyeha;

public void setLala(Lala lala) {
    this.lala = lala;
}


this.oyeha = (Oyeha) this.lala;
            executeHostBean = this.oyeha.updateMethod(a, b, c, d, e);

Лала - класс отцов.

Oyeha - это ребенок, который расширяет Lala.

Но когда я запускаю этот код, я получаю сообщение об ошибке:

java.lang.ClassCastException: $ Proxy201

Я не могу найти, где моя ошибка. Может кто-нибудь помочь мне решить эту проблему, пожалуйста? Спасибо.:)

3 ответа

Если у вас есть что-то вроде Spring, внедряющего объект Lala, это может быть создание динамического прокси-объекта (это то, что предлагает сообщение об ошибке).

Если в вашем дизайне абсолютно необходимо использовать downcasting, вы можете пересмотреть дизайн.

Ваша проблема, вероятно, в том, что this.lala настраивается на экземпляр Lala, который не является экземпляром Oyeha. Так как Oyeha является подклассом Lala, можно позвонить public void setLala с аргументом, который является экземпляром Oyeha, например так:

Lala childInstance = new Oyeha();
setLala(childInstance);

но также возможно вызвать этот метод с аргументом, который является просто экземпляром Lala, например так:

Lala parentInstance = new Lala();
setLala(parentInstance);

В первом случае this.lala это Oyeha, так что вы можете бросить его Oyeha. Но в последнем случаеthis.lala это просто Лала, и ваш актерский состав this.lala Ойехе не получится, потому что Лала не Ойеха.

Как дополнение к другим ответам (они в основном уже прибили это):

Предположим, вы могли бы так опускать, что линия this.oyeha = (Oyeha) this.lalaработал, и в Ойехе было какое-то поле, скажем, test,

Если вы тогда пытались использовать this.oyeha.test где-то как бы знать где test является? Еще хуже, что если случаи Oyeha занять значительно больше памяти, и он произвольно выбирает адрес за пределами того, что было отложено для случая Lala?

Я полагаю, что изобретатели Java предвидели подобную ситуацию и таким образом сделали так, чтобы вы не могли взять экземпляр типа и привести к одному из его подклассов.

(Я бы поставил это в комментарии, но это слишком много)

Другие вопросы по тегам