class TipoGenerico {}
class TipoEspecifico extends TipoGenerico {}
E você tem o seguinte método:
public TipoGenerico retornaAlgoGenerico() {
// Observe que mesmo o retorno sendo TipoGenerico é retornado um TipoEspecifico.
return new TipoEspecifico();
}
E você quer atribuir o retorno desse método à uma variável do tipo TipoEspecifico, como a assinatura do método retorna um TipoGenerico, a linha abaixo vai causar erro de compilação.
TipoEspecifico objeto = retornaAlgoGenerico();
Aí você consegue numa boa fazer o seguinte:
TipoGenerico objeto = retornaAlgoGenerico();
Mas você precisa chamar um método declarado na classe do TipoEspecifico, aí o código abaixo não vai compilar:
TipoGenerico objeto = retornaAlgoGenerico();
objeto.metodoEspecifico(); // esse método não existe no TipoGenerico
Qual a solução? Fazer um cast para TipoEspecifico:
TipoEspecifico objeto = (TipoEspecifico) retornaAlgoGenerico();
objeto.metodoEspecifico(); // esse método existe no TipoEspecifico