Даункинг исключение
Я сделал этот код:
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 предвидели подобную ситуацию и таким образом сделали так, чтобы вы не могли взять экземпляр типа и привести к одному из его подклассов.
(Я бы поставил это в комментарии, но это слишком много)