2013-05-09 3 views
1

Может ли кто-нибудь здесь объяснить мне, почему я получаю исключение java.lang.ClassCastException при подавлении родительского ребенка?Down Casting in Java

public class Child extends Parent{ 
public static void main(String[] args){ 
    new Child().go(); 
} 
void go(){ 
    go2(new Parent(), new Child()); 
    go2((Child) new Parent(), new Child()); 
} 
void go2(Parent p1, Child c1){ 
    Child c2 = (Child)p1; 
    Parent p2 = (Parent)c1; 
} 
} 
class Tree{} 

Я прочитал ссылку на переменную и произвел поиск в Интернете. Может кто-нибудь, пожалуйста, объясните мне это? Я действительно хочу понять, почему это исключение. Спасибо

+0

Вы роете родителя, который не является дочерним по отношению к ребенку. – user902383

+0

Он не прошел тест IS-A: ребенок-родитель-ребенок, но родитель не ребенок. – duffymo

ответ

0

из-за полиморфной ссылки, когда вы храните объект sub-type до super-type ссылкой, вы не можете использовать метод, специфичный для sub-type. но вы можете просто получить, какие методы определены в super-type.

, чтобы использовать методы подтипа, вам необходимо указать ссылку super-type на номер sub-type.

Parent p = new Child(); 
... 
... 
((Child)p).childMethod(); 

, но это возможно только тогда, когда вы знаете объекта, назначенный p фактически типа Child.иначе это даст ClassCastException

3

Допустим, вы родительский класс Animal и Child class Bird. Вы можете бросить из Птицы в Животное, потому что все Птицы - животные. НЕ МОЖЕТ отбрасывать от животных к птице, потому что не все животные - птицы.

+0

то как я могу применить downcasting для родителя? – 2013-05-10 00:40:10

+0

Родитель «ниже», чем ребенок. Так что это будет «UPcast». И «взлеты» невозможны. Может быть, вы можете рассказать мне больше, зачем вам это делать, и что именно вы пытаетесь сделать. – bigGuy

1

Вы можете отличить Child до Parent. С Child распространяется Parent, Любой экземпляр Child является Parent (но только с дополнительными материалами доступен для Child). Однако p1 является Parent. Поскольку Parent не является Child, вы не можете лить экземпляр Parent в Child.

Я скопировал точно ответ на аналогичную форму вопроса google search. Пожалуйста, сделайте домашнее задание в следующий раз и прочитайте FAQ.

+0

спасибо Адам. Я прочитал FAQ, прежде чем задавать этот вопрос, я просто хочу, чтобы кто-то объяснил это мне, потому что у меня проблемы с пониманием понижения. – 2013-05-10 00:47:03

0

A Parent не является Child. То есть, Parent имеет необходимые поля для обработки, как если бы это был экземпляр Child и выполнял все специальные методы - договор Child. Представьте, если Child имел переменную childOnly и метод childProcess, и вы попытались позвонить childProcess на объект, который является Parent в памяти. Он не может работать, поэтому Java запрещает вам рассматривать Parents как Childs.

2

Вот ваши проблематичные коды раздели:

go2(new Parent()); 

... 

void go2(Parent p1){ 
    Child c2 = (Child)p1; 
} 

Компилятора позволяет вашему бросок p1 от «Родителя» до «ребенка», потому что p1 может быть «Ребенком». Однако вы, очевидно, видите, что p1 НЕ является дочерним. Таким образом, ваш код отлично подходит для компиляции, но будет работать во время выполнения.

Это означает, что все добавленное поведение, которое вы, возможно, определили в своем классе «Ребенок», недоступно, поскольку у вас есть только экземпляр типа «Родитель».

+0

Я думал, что если ребенок расширяет родительский, родитель может быть перенесен в дочерний? как можно применить подавление? Благодарю. – 2013-05-10 00:43:01

0

Допустят, Car является интерфейсом голой кости

Merc is a Car (Merc extends Car) 

BMW is a Car (BMW extends Car) 

Теперь

вы можете взять BMW и лакомства это голая кость автомобиль, как BMW, как и все особенности автомобиль. так что вы можете бросить BMW в автомобиль, поэтому (Car car = (Car)bmw)является законным.

Если вы возьмете автомобиль с голыми костями и попытаетесь рассматривать его как BMW, это невозможно сделать, поскольку у BMW будет намного больше, чем автомобиль с голыми костями.

так,

BMW bmw = (BMW)carявляется незаконным

То же реальный мир концепция распространяется на объектно-ориентированный мир.