Кастинг на Java не є магією, це ви говорите компілятору, що об’єкт типу A насправді є більш конкретним типом B, і таким чином отримуєте доступ до всіх методів на B, яких у вас не було б інакше. Ви не виконуєте жодної магії чи конверсії під час виконання кастингу, ви по суті говорите компілятору "повірте мені, я знаю, що роблю, і можу гарантувати вам, що цей Об'єкт у цьому рядку насправді є <Вставити привід введіть тут>. " Наприклад:
Object o = "str";
String str = (String)o;
Вище сказано добре, не магія, і все добре. Об'єкт, що зберігається в o, насправді є рядком, і тому ми можемо без проблем передати в рядок.
Існує два шляхи, коли це може піти не так. По-перше, якщо ви робите два типи в абсолютно різних ієрархіях успадкування, то компілятор знатиме, що ви дурний, і зупинить вас:
String o = "str";
Integer str = (Integer)o;
По-друге, якщо вони знаходяться в одній ієрархії, але все ще є недійсним приводом, тоді ClassCastExceptionбуде викинуто a під час виконання:
Number o = new Integer(5);
Double n = (Double)o;
Це по суті означає, що ви порушили довіру компілятора. Ви сказали, що можете гарантувати, що об’єкт має певний тип, але це не так.
Навіщо потрібен кастинг? Ну, для початку вам це потрібно лише при переході від більш загального типу до більш конкретного типу. Наприклад, Integerуспадковує від Number, тому, якщо ви хочете зберегти Integerяк, Numberтоді це нормально (оскільки всі цілі числа є числами.) Однак, якщо ви хочете піти навпаки, вам потрібен привід - не всі числа є цілими числами (а також як ціле число ми маємо Double, Float, Byte, Longі т.д.) і навіть якщо є тільки один підклас в вашому проекті або JDK, хто - то може легко створити ще й поширювати це, так що ви не маєте ніякої гарантії , навіть якщо ви думаєте , що це єдиний, очевидний вибір !
Що стосується використання для кастингу, ви все ще бачите необхідність у цьому в деяких бібліотеках. До Java-5 він активно використовувався в колекціях та різних інших класах, оскільки всі колекції працювали над додаванням об'єктів, а потім видавали результат, який ви отримали назад з колекції. Однак з появою дженериків більша частина використання для кастингу зникла - його замінили дженерики, які забезпечують набагато безпечнішу альтернативу, без потенціалу для ClassCastExceptions (насправді, якщо ви використовуєте дженерики чисто, і вони компілюються без попереджень, у вас є гарантія, що ви ніколи не отримаєте ClassCastException.)