Overloading é um polimorfismo em tempo de compilação. Realmente

Conheço a diferença sintática entre substituir e sobrecarregar. E também sei que substituir é polimorfismo em tempo de execução e sobrecarregar é polimorfismo em tempo de compilação. Mas minha pergunta é: "A sobrecarga é realmente um polimorfismo em tempo de compilação? A chamada de método está realmente resolvendo em tempo de compilação?". Para esclarecer meu argumento, vamos considerar um exemplo de class

public class Greeter {
    public void greetMe() {
        System.out.println("Hello");
    }

    public void greetMe(String name) {
        System.out.println("Hello " + name);
    }

    public void wishLuck() {
        System.out.println("Good Luck");
    }
}

Como todos os métodosgreetMe(), greetMe(String name), wishLuck() são públicos, todos eles podem ser substituídos (incluindo um sobrecarregado), certo? Por exemplo

public class FancyGreeter extends Greeter {
    public void greetMe() {
        System.out.println("***********");
        System.out.println("*  Hello  *");
        System.out.println("***********");
    }
}

Agora, considere o seguinte trecho:

Greeter greeter = GreeterFactory.getRandomGreeter();
greeter.greetMe();

OgetRandomGreeter() retorna um método aleatórioGreeter objeto. Pode retornar um objeto deGreeter ou qualquer uma de suas subclasses, comoFancyGreeter ouGraphicalGreeter ou qualquer outro. OgetRandomGreeter() criará os objetos usandonew ou carregar dinamicamente o arquivo de classe e criar objeto usando reflexão (acho que é possível com reflexão) ou de qualquer outra maneira possível. Todos esses métodos deGreeter pode ou não ser substituído nas subclasses. Portanto, o compilador não tem como saber se um método específico (sobrecarregado ou não) foi substituído. Certo? Além disso, a wikipedia diz em Funções virtuais:

Em Java, todos os métodos não estáticos são, por padrão, "funções virtuais". Somente os métodos marcados com a palavra-chave final, que não podem ser substituídos, e os métodos privados, que não são herdados, não são virtuais.

Desde que as funções virtuais são resolvidas em tempo de execução usando o envio dinâmico de métodos e, como todos os métodos não particulares e não finais são virtuais (sobrecarregados ou não), eles devem ser resolvidos em tempo de execução. Certo

Então, como a sobrecarga ainda pode ser resolvida em tempo de compilação? Ou há algo que eu entendi errado ou estou perdendo?

questionAnswers(4)

yourAnswerToTheQuestion