Oi Felipe, tudo bem? Eu gostaria de fazer uma adição.
É bem verdade que se você fizer Funcionario g1 = new Gerente()
você não acessa as coisas específicas do gerente por que o compilador em tempo de compilação, não consegue garantir que o objeto g1 é um gerente, neste caso, o tipo da esquerda é quem garante a tipagem.
Quando você faz isso, neste caso, você está sendo mais amplo por que você está usando o supertipo do Gerente. O Gerente é uma especialização do Funcionário e por isso não dizemos que o Gerente é mais amplo. E sim mais específico.
A última questão é: por que você faria isso? Puro polimorfismo.
Imagine que você deseje calcular a bonificação do salário de acordo com o cargo (se cada cargo tem um tipo, fica fácil), neste caso, você teria o cálculo da bonificação direto dentro do Funcionario e sim, eu entendo que gerente também possua esse método por herança, mas lembra da especialização? Ótimo, neste caso cada subclasse poderia sobrescrever o método e ter sua própria lógica de cálculo da bonificação. Porém, em algum lugar você iria querer processar esse valor sem precisar fazer uma regra de criar o objeto do tipo específico Gerente
ou Engenheiro
. Então você poderia ter algo que funcione da seguinte forma:
public void defineNovoSalario(Functionario f) {
f.setSalario(f.calculaAumento());
}
Esse método funciona tanto para objetos do tipo Funcionário, quanto Gerente, quanto Engenheiro. Ele é do supertipo, então o subtipo também é aceito na parametrização. Claro, os métodos precisam estar no supertipo, mas os valores da conta, serão usados do subtipo informado.
Posso ter bagunçado a explicação, mas é por ai. Ah, isso também funciona com Interfaces, então pode ser muito comum você ver por ai coisas nessa linha:
List<String> nomes = new ArrayList<>();
Por que neste caso, só nos importamos com o que uma lista é capaz de fazer, não nos preocupamos se é um ArrayList ou qualquer outro tipo de lista.
É o que falamos sobre programar voltados para a interface e não para a implementação. Importa o que o objeto faz e não o que ele é de fato.