Рассмотрим следующий пример
public class Animal
{
public void eat(){}
}
public class Dog extends Animal
{
public void eat(){}
public void main(String[] args)
{
Animal animal=new Animal();
Dog dog=(Dog) animal; //will not work
}
}
С помощью броска вы, по сути, говорите компилятору «доверься мне. Я профессионал Я знаю, что делаю, и знаю, что, хотя вы не можете этого гарантировать, я говорю вам, что эта переменная для животных определенно будет собакой ».
Поскольку животное на самом деле не собака (это животное, вы можете сделать животное животных = новая собака(), и это будет собака), ВМ выдает исключение во время выполнения, потому что вы нарушили это (вы сказали компилятору, что все будет в порядке, а это не так!)
Компилятор немного умнее, чем просто слепо принимать все, если вы попытаетесь наложить объекты в разные иерархии наследования (например, приведите Собака к строке), тогда компилятор отбросит его обратно, потому что он знает, что никогда не может работать.
Потому что вы, по сути просто остановить компилятор из жалуюсь, каждый раз, когда вы приводите, важно, чтобы убедиться, что вы не будете вызывать ClassCastException с помощью InstanceOf в случае оператора (или что-то об этом.)
В вашем случае вы говорите, что моя ссылка b указывает на объект точки B, а затем вы укажете на объект класса A (который не является объектом класса B, который ожидает ссылка b). Следовательно, вы получаете исключение classCastException.
Вы могли бы сделать что-то вроде
A a = new B();
B b = (B) a;
В чем вопрос? Совершенно очевидно, что вы не можете притворяться, что любой объект является списком карты, автомобиля или гнезда. Поэтому, если вы хотите автомобиль, вы должны создать автомобиль. Создание объекта и отбрасывание его на автомобиль не волшебным образом превратит его в автомобиль. –
возможный дубликат [явное литье из суперкласса в подкласс] (http://stackoverflow.com/questions/4862960/explicit-casting-from-super-class-to-subclass) –