Varargs e sobrecarga de métodos

Métodos:

[code]public List executarQuery(String hql, Object … params) {
// …
}

public List executarQuery(String hql, Map<String, Object> params) {
// …
}[/code]

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?

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:

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.

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

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?

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.

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

[code]
m(String s) {}
m(Object o) {}

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

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

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

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.