Безопасность типов и обобщенные шаблоны с подстановочными знаками: понимание запрещенного модификатора
При работе с универсальными коллекциями в Java концепция обобщенных шаблонов с подстановочными знаками может привести к определенным ограничения, которые на первый взгляд могут показаться нелогичными. Ярким примером является невозможность добавлять значения в коллекцию Java с помощью универсального типа с подстановочными знаками.
Рассмотрим следующий фрагмент кода:
List extends Parent> list = ...; Parent p = factory.get(); // returns concrete implementation list.set(0, p); // fails here: set(int, ? extends Parent) cannot be applied to (int, Parent)
Почему этот код не компилируется? Ответ кроется во внутренних механизмах безопасности, которые реализуются дженериками с подстановочными знаками.
Принцип неограниченного поиска и ограниченного добавления
Общий тип с подстановочными знаками, обозначаемый ? расширяет Parent, представляет список элементов, которые являются потомками родительского интерфейса. Хотя он позволяет неограниченное извлечение этих элементов, безопасность типов налагает ограничения на добавление значений в коллекцию.
Если бы код был разрешен для компиляции, он бы позволил назначить экземпляр Parent элементу в списке. Однако это действие потенциально может нарушить безопасность типов.
Рассмотрим следующий сценарий:
ListchildList = new ArrayList(); childList.add(new Child()); List extends Parent> parentList = childList; parentList.set(0, new Parent()); Child child = childList.get(0); // No! It's not a child! Type safety is broken...
В этом сценарии список дочерних объектов преобразуется в список ? расширяет Родителя. Последующее присвоение родительского экземпляра первому элементу списка нарушает типобезопасность, поскольку результирующий список содержит элемент, который не является допустимым дочерним экземпляром.
Обеспечение безопасности неизменяемого типа
Запрещая добавление значений в общие коллекции с подстановочными знаками, Java обеспечивает безопасность неизменяемых типов. Это гарантирует, что элементы списка всегда соответствуют ограничениям, налагаемым его объявленным типом.
В отсутствие этого ограничения безопасность типов будет нарушена, что приведет к потенциальным ошибкам и неожиданному поведению.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3