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 .