Por que não posso utilizar métodos com mesmo nome e tipos diferenciados por parâmetros genéricos?

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);            
     ...
}