Senhores,
não compreendi a regra do uso de generics para esse caso, vejam a situação:
public interface BaseDAO<T,Key,Value> {
// exemplo 1 - isso o compilador não aceita
void destroy(T obj);
void destroy(Key id);
// exemplo 2 - isso o compilador aceita
T find(Key key);
List<T> find(Value value);
}
Código baseado no exemplo http://www.guj.com.br/posts/list/66036.java
E observe que se você declarar outros métodos sem o uso de generics, dessa forma:
void destroy(T obj);
void destroy(Integer id);
void destroy();
o compilador aceita… somente quando se usa dois ou mais tipos passados por parâmetros…
A questão aqui é compreender a regra da aplicação do generics, alguém sabe?
vw
Por que voce pode passar dois generics do mesmo tipo e o java não ia saber qual método chamar.
O generics só existe durante a compilação, depois ele é apagado. No final, vc ia ter dois métodos destroy(Object obj), e isso não pode.
Essa regra eu compreendo,
tanto que se tentar passar algo assim:
ClasseX implements BaseDAO<ClasseXVO,Integer,Integer>
o erro ocorre nos métodos find também… mas o problema está na combinação do primeiro termo com os demais… veja que Key e Value não geram a mesma falha…
certo?
Veja que se você puser um “constraint” no tipo T (de forma que ele nunca possa ser “Value”) é possível ter esses 2 métodos distintos.
import java.util.List;
class Key {
}
class Value {
}
class DAO {
}
public interface BaseDAO<T extends DAO,Key,Value> {
// Note que se você puser um "constraint" no tipo T, é possível diferenciar T de Key,
// permitindo ter 2 métodos com tipos de parâmetros diferentes.
void destroy(T obj);
void destroy(Key id);
...
}