Page 102 - 4836
P. 102
Звичайно, це може призвести і до труднощів. Якщо ви
захочете здійснювати якісь операції над елементом колекції (а
ви ставите в колекцію об'єкти саме для того, щоб потім їх
витягувати і обробляти), ви не зможете скористатися його
методами, якщо не привести об'єкт до його «справжнього»
класу за допомогою явного приведення типів.
Наприклад, у вас є об'єкт класу String (звичайний
рядок) і ви хочете додати його в стек stack за допомогою
методу push (Object item):
String str = " Особливий рядок ";
stack.push (str);
Колекція, що зберігає елементи типу Object, відразу ж
«забуває», що ваш об'єкт - рядок, оскільки при його додаванні
було здійснено автоматичне приведення типу String до типу
Object. Ви можете витягти ваш об'єкт методом pop( ), але щоб
повернути йому колишній тип (а без цього ви не зможете
скористатися жодним з його методів), доведеться здійснити
явне перетворення оператором (String) :
str = (String) stack.pop();
Це не є проблемою, просто потрібно пам'ятати, об'єкти
якого класу ви ставите в колекцію і виконувати відповідне
перетворення типу над кожним елементом, який побував у
колекції.
Але якщо спробувати привести об'єкт до
неправильного типу, виникне помилка в програмі:
stack.push (new Dog ("Шарик ", 12)) ; // Поміщаємо в
стек собаку
str = (Mouse) stack.pop (); // Виймаємо собаку і
намагаємося оголосити її мишкою, але ці класи не пов'язані
спадкуванням і програма видасть помилку під час виконання.
Так що, можливістю поміщати в колекцію будь-які
об'єкти, скористатися швидше за все не вийде. Уявіть собі,
що ваша програма повинна «пам'ятати», що перший елемент
списку - рядок, другий - число, третій - собака, четвертий -
100