Deixando replace genérico

  • Criar interface IdProjection

  • Tipos Product e ProductProjection devem implementar IdProjection

  • Refatorar o método auxiliar para que fique genérico

Bom, os dois parâmetros precisam ter ID, tanto a Projection quanto a Entidade:

Para deixar isso genérico, criaremos uma interface que tenha o método getId.

No pacote interface criar: IdProjection

Agora, o nosso ProductProjection não terá mais um getId(). Ele irá herdar a interface acima.

O Product é a mesma coisa, também irá herdar a interface (colocar @Override no getId para o compilador).

Voltando ao método replace, deixando ele genérico (usando tipo curinga).

Na nomeação do método, passaremos o tipo genérico . E não será mais uma lista de Product, e sim uma lista de IdProjection. < Só isso, não iria funcionar, para que essa lista aceite como subtipo, uma lista de Produto, iremos utilizar o tipo curinga (? extends).

O tipo curinga em suma diz: será uma lista de qualquer tipo (ou subtipo) de IdProjection. Como o Product implementa esse IdProjection, ele é um subtipo de IdProjection (Long).

Ou seja, uma lista de Product, casa com uma Lista de IdProjection.

Copiaremos a mesma nomenclatura para os parâmetros:

Método alterado:

Service alterado (um simples casting):

Atualizado