[Herança + Generics] Implementação de Interface parametrizada não aceita Generics

Olá:

eu tenho a seguinte interface:

public interface Entidade<PK extends Serializable> {

	public PK getId();
	
	public void setId(PK id);
	
}

Daí criei a seguinte implementação:

public abstract class AbstractEntidade<PK extends Serializable> implements Entidade {

	private PK id;

	@Override
	public PK getId() {
		return this.id;
	}

	@Override
	public void setId(PK id) {
		this.id = id; 
	}
}

Entretanto o Eclipse apresenta os seguintes erros:

Sendo que o último item é uma advertência, não um erro.
Minhas tentativas de solucionar isso foram as seguintes:

:frowning: : Simplesmente eliminar o “” depois de AbstractEntidade: O compilador deixou de reconhecer PK.
:? : Eliminar a relação com Entidade (eliminar o “implements Entidade”): Funciona, mas… não é bem isso que eu queria.
:frowning: : Retirar o @Override* de setId(): Elimina o segundo erro (The method setId(PK) of type AbstractEntidade must override or implement a supertype method) mas mantém o primeiro e a advertência.
:? : Na interface retirar o vinculo de PK com Serializable ( ao invés de ) mas continuar mantendo na implementação (AbstractEntidade continua com ): Sem o @Override* sobre setId() os erros desaparecem mas permanece a advertência. Se o @Override* voltar o segundo erro.

Suponho que isso tenha alguma coisa a ver com os erasure dos Generics (vide o primeiro erro). Alguém tem uma solução mais inteligente?

Grato,

Uai, seu código, com algumas alterações, funciona direitinho. É só trocar “implements Entidade” por “implements Entidade”.

import java.io.Serializable;

public interface Entidade<PK extends Serializable> {  
     PK getId();  
     void setId(PK id);  
}  

public abstract class AbstractEntidade<PK extends Serializable> implements Entidade <PK> {  
     private PK id;  
   
     @Override  
     public PK getId() {  
         return this.id;  
     }  
   
     @Override  
     public void setId(PK id) {  
         this.id = id;   
     }  
} 

public class Carro implements Serializable {
}

public class EntidadeCarro extends AbstractEntidade <Carro> {
    private Carro id;
    @Override
    public Carro getId() { return this.id; }
    @Override
    public void setId(Carro  id) { this.id = id; }
}

[quote=enantiomero]Uai, seu código, com algumas alterações, funciona direitinho. É só trocar “implements Entidade” por “implements Entidade”.
[/quote]
É verdade! Na verdade posso até retirar a referência à Serializable na declaração da classe:

public abstract class AbstractEntidade<PK> implements Entidade<PK> {

Mais uma sutileza que precisamos a aprender.
:thumbup: Obrigado!