"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que não consigo adicionar elementos a uma coleção Java com um tipo genérico curinga (`? estende Parent`)?

Por que não consigo adicionar elementos a uma coleção Java com um tipo genérico curinga (`? estende Parent`)?

Publicado em 17/12/2024
Navegar:899

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

Type Safety and Wildcard Generics: Understanding the Forbidden Modifier

Ao trabalhar com coleções genéricas em Java, o conceito de genéricos curinga pode introduzir certos limitações que podem inicialmente parecer contra-intuitivas. Um excelente exemplo é a incapacidade de adicionar valores a uma coleção Java com um tipo genérico curinga.

Considere o seguinte trecho de código:

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)

Por que este código falha ao compilar? A resposta está nos mecanismos de segurança inerentes que são aplicados pelos genéricos curinga.

O princípio da recuperação irrestrita e adição restrita

O tipo genérico curinga, denotado por ? estende Parent, representa uma lista de elementos que são descendentes da interface Parent. Embora permita a recuperação irrestrita desses elementos, a segurança do tipo dita restrições na adição de valores à coleção.

Se o código pudesse ser compilado, permitiria a atribuição de uma instância Parent a um elemento dentro da lista. No entanto, esta ação pode quebrar a segurança de tipo.

Considere o seguinte cenário:

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...

Neste cenário, uma lista de objetos Filho é convertida em uma lista de ? estende Pai. A atribuição subsequente de uma instância Parent ao primeiro elemento da lista viola a segurança de tipo, pois a lista resultante contém um elemento que não é uma instância Child válida.

Garantindo segurança de tipo imutável

Ao proibir a adição de valores a coleções genéricas curinga, Java impõe segurança de tipo imutável. Isso garante que os elementos da lista sempre cumpram as restrições impostas pelo seu tipo declarado.

Na ausência dessa restrição, a segurança do tipo seria comprometida, levando a possíveis erros e comportamento inesperado.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3