Почему случай 1 в порядке, а случай 2 не в порядке: потому что Dog
является Animal
, но не каждый Animal
является Dog
.
class Animal { }
class Dog extends Animal { }
class Cat extends Animal { }
Dog fifi = new Dog();
Cat tommy = new Cat();
// OK because Dogs and Cats are Animals
Animal pet1 = fifi;
Animal pet2 = tommy;
// Not OK because an Animal is not always a Dog
Dog doggy = pet2;
Обратите внимание, что приведениеничего не делает с объектом;в частности, он не выполняет никакого преобразования объектов.Кастинг только говорит компилятору: «У меня есть этот объект, и я лучше вас знаю, что это такое; я хочу, чтобы вы относились к нему как к типу X и не давали мне никаких сообщений об ошибках».
строка как это:
Dog doggy = pet2;
компилятор будет жаловаться, потому что он не может быть уверен, что pet2
на самом деле Dog
;он только знает, что это Animal
- и не все Animal
с Dog
с.Вы можете выполнить приведение, чтобы компилятор не жаловался на это:
// Tell the compiler that you want it to treat pet2 as a Dog
Dog doggy = (Dog)pet2;
Но когда вы запустите программу, Java все равно проверит, действительно ли pet2
является Dog
, и если это не так.', вы получите ClassCastException
.
(и вопрос в вашем названии совершенно противоположен тому, что вы имеете в виду, как заметил biziclop).