Dada a regra sobre o Java escolher a versão mais específica de um método possível, o que fazer você acha que esse código gera?
public class ReferenceTypes {
public void fly(String s) {
System.out.print("string ");
}
public void fly(Object o) {
System.out.print("object ");
}
public static void main(String[] args) {
ReferenceTypes r = new ReferenceTypes();
r.fly("test");
r.fly(56);
} }
A resposta é "objeto de string" . A primeira chamada é uma String e encontra uma correspondência direta. Não há razão para usar a versão do objeto quando há uma boa lista de parâmetros de String apenas esperando para ser chamado. A segunda chamada procura uma lista de parâmetros int . Quando não encontra primeiro, ele faz um autobox para Integer . Como ainda não encontra uma correspondência, ela vai para o Objeto .