Какъв е смисълът на предупреждението за безопасност на типа в някои отличия на Java generics?

Translate

Какво е значението наПредупреждение за Java?

Безопасност на типа: Прехвърлянето от Object to List <Integer> всъщност проверява спрямо изтрития тип List

Получавам това предупреждение, когато се опитвам да прехвърля обект към тип с обща информация, като например в следния код:

Object object = getMyList();
List<Integer> list = (List<Integer>) object;
This question and all comments follow the "Attribution Required."

Всички отговори

Translate

Това предупреждение е налице, защото Java всъщност не съхранява информация за типа по време на изпълнение в обект, който използва генерични продукти. По този начин, акоobjectвсъщност еList<String>, там няма да имаClassCastExceptionпо време на изпълнение, освен докато елементът не бъде достъпен от списъка, който не съвпада с родовия тип, дефиниран в променливата.

Това може да доведе до допълнителни усложнения, ако елементите се добавят към списъка, с тази неправилна информация за общ тип. Всеки код, който все още съдържа препратка към списъка, но с правилната обща информация за типа, сега ще има несъвместим списък.

За да премахнете предупреждението, опитайте:

List<?> list = (List<?>) object;

Имайте предвид обаче, че няма да можете да използвате определени методи като добавяне, защото компилаторът не знае дали се опитвате да добавите обект от неправилен тип. Горното ще работи в много ситуации, но ако трябва да използвате добавяне или някакъв подобно ограничен метод, просто ще трябва да понесете жълтото подчертаване в Eclipse (илиSuppressWarningанотация).

източник