Problema muito estranho ocorrendo. Estou usando JPA como API de persistência e Java 5.
Tenho uma classe com um método de busca definido assim:
public <T extends BaseEntity> T find(Class<T> clazz, Serializable pk) {
try {
return em.find(clazz, pk);
} catch (RuntimeException e) {
throw new BaseException(e);
}
}
Porém o código acima não compila (ao menos no JDeveloper 10.1.3.2-4066). Ocorre a seguinte mensagem de erro:
Ele diz que não encontra o método find no EntityManager, porém, segundo a documentação da API ele é definido assim:
No entanto, se eu mudo de <T extends …> de BaseEntity para Object na assinatura do método, ele compila:
public <T extends Object> T find(Class<T> clazz, Serializable pk) {
try {
return em.find(clazz, pk);
} catch (RuntimeException e) {
throw new BaseException(e);
}
}
Não entendo porque funciona com Object e não funciona com a minha interface BaseEntity.
Porém, eu acabei mudando o código como abaixo e funciona:
public <T extends BaseEntity> T find(Class clazz, Serializable pk) {
try {
return (T) em.find(clazz, pk);
} catch (RuntimeException e) {
throw new BaseException(e);
}
}
Retirei o <T> do primeiro argumento e faço um cast do retorno do método em.find().
Alguém tem idéia do porquê???
