Varargs e sobrecarga de métodos

8 respostas
S
Métodos:
public List executarQuery(String hql, Object ... params) {
// ...
}
       
public List executarQuery(String hql, Map<String, Object> params) {
// ...
}
Chamada:
Map<String, Object> params = new HashMap<String, Object>();
StringBuilder hql = new StringBuilder("select [...]");
List<ResultadoAnalise> list = executarQuery(hql.toString(), params);

Por que é chamado o primeiro método e como fazer para o segundo ser o chamado?

8 Respostas

mateusbrum

Boa tarde Schuenemann!
Deve haver algum equivoco na tua conclusão :? , pois uma collection nada tem a ver com um Objeto Array;
Se por acaso o overload fosse da seguinte maneira:

metodo void (String [] o){}
metodo void (String … o){}

O compilador em tempo de execulsão escolheria o primeiro método, pois isso seria “mais natural”. :wink:

S

Mas, eu não concluí nada…

Como passei um Map, eu esperava que ele chamasse o método que recebe um Map. Só que ele cria um array, coloca o Map na primeira posição e chama o método que recebe array.

peerless

Utilize Generics se for o caso. E transforme o segundo parâmetro em um Objeto do tipo Map (na hora de enviar o argumento)

S

Não dá pra usar generics no primeiro (não tem muito sentido) e o segundo método já usa.
Sobre transformar, fazer cast para Map<String, Object> faz chamar o “correto”, mas, por que fazer isso, se a referência já era Map<String, Object>? Por que precisa fazer um cast para o próprio tipo?

peerless

Por que todo mundo é filho de Object (lembra?), caso não explicite qual tipo você passa para aceitar, o Object via comer todo mundo que vier por prioridade.

S

Como assim?
O normal é pegar o tipo mais específico.

m(String s) {}
m(Object o) {}

metodo_qualquer() {
    m(null); // O escolhido é o que recebe String
}
mateusbrum

Estranho…
Nos meus teste ele utilizou o método do Map!? :?
Poderia postar teu teste por completo ?

S

mateusbrum:
Estranho…
Nos meus teste ele utilizou o método do Map!? :?
Poderia postar teu teste por completo ?

Eu tirei o cast e passou a pegar o do Map. Isso é esquisito demais. A única coisa que fiz foi colocar o cast e depois tirar.
Alguma coisa o Netbeans fez para acontecer isso. Estou sem entender.

Criado 28 de dezembro de 2007
Ultima resposta 28 de dez. de 2007
Respostas 8
Participantes 3