Normalmente isso esta associado a “downcast”, e quer dizer basicamente o seguinte:
Imagina 3 classes: Aeronave(classe pai), e Aviao e Helicoptero, que extendem de Aeronave
Suponhamos que o metodo getPrivate() retorna um objeto Aeronave. Mas vc sabe que, em tempo de execucao, aquele objeto é um Aviao;
Vc pode fazer isso tranquilamente:
Aeronave a = objetoAviao //PERMITIDO, sem necessidade de cast
Mas pra fazer o contrario, vc precisa do cast explicito, pois vc esta dizendo “olha JVM, eu sei que aquele objeto Aeronave ali pode ser tanto um aviao quanto um helicoptero, mas eu estou GARANTINDO pra vc que vai ser um aviao, pois quero chamar metodos especificos dele… entao confia em mim”
Aviao a = (Aviao)objetoAeronave //CAST necessario
Perceba que, se o objetoAeronave for, na verdade, um helicoptero, vc ganhará uma bela ClassCastException (Aviao != Helicoptero);