«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему я не могу добавить элементы в коллекцию Java с помощью универсального типа с подстановочными знаками (`? расширяет родительский`)?

Почему я не могу добавить элементы в коллекцию Java с помощью универсального типа с подстановочными знаками (`? расширяет родительский`)?

Опубликовано 17 декабря 2024 г.
Просматривать:207

Why Can't I Add Elements to a Java Collection with a Wildcard Generic Type (`? extends Parent`)?

Безопасность типов и обобщенные шаблоны с подстановочными знаками: понимание запрещенного модификатора

При работе с универсальными коллекциями в 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 элементу в списке. Однако это действие потенциально может нарушить безопасность типов.

Рассмотрим следующий сценарий:

List childList = 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