Duvida , Por que eu preciso fazer este Cast

Boa tarde a todos …

Queria saber pq e preciso fazer este cast
Tenho uma class funcionario .
tenho uma classe gerente que estende funcionario
E uma classe control , que processa informaçoes .

Segue o codigo:

public class Funcionario 
{
	private String name;
	private double salary;
	private String cpf;
	private int amountOfOvertime;
	private double valueTime;
// getter and setters ...
}

public class Gerente extends Funcionario
{
	private String login ;
	private String password ;
	private int numberOfStaffManaged;
}


// Um metodo da class control 
public void registerManager()
	{
		Funcionario f = new Gerente();
		System.out.println(" Register of Manager ");
		System.out.println(" ");
		f.setName(getUserInput("Name :"));
		f.setCpf(getUserInput("CPF : "));
		f.setSalary(Double.valueOf(getUserInput("Salary :")));
		((Gerente) f).setNumberOfStaffManaged(Integer.valueOf(getUserInput("Number of staff manager"))); // Por que é preciso fazer este Cast?vale para duas linhas abaixo tambem.
		((Gerente) f).setLogin(getUserInput("Login : "));
		((Gerente) f).setPassword(getUserInput("Password :"));
		masterClass.register(f);
	}

Como vc declarou sua variável como sendo do tipo Funcionario, e nem todo funcionário é um Gerente, você precisa dizer ao Java de que a variável se trata de um Gerente para que possa usar os métodos específicos dessa classe.

Declarado como funcionário, vc só pode usar os métodos pertencentes à classe funcionário, ou suas superclasses.

Como ali se trata de um cadastro de gerente, crie a variável como sendo do tipo Gerente:
Gerente funcionario = new Gerente();

Mesmo que depois o método da master class receba um funcionário (vai funcionar, pois um gerente é um funcionário).

Boa tarde Galera !

Como sempre, ViniGodoy, claro e conciso!
Falou e disse !

Agora só pra ver se eu entendi:

Todo Gerente é um Funcionário.
No entanto a reciproca não é verdadeira, por isso é necessário deixar explicito para o Java que a variavel “f” é um Gerente, para que ele possa acessar os métodos especificos do Gerente. É isso ?

ViniGodoy, se não for pedir muito, poderia explicar como funciona essa parte:

Funcionario f = new Gerente();

Estou declarando uma variavel do tipo “Funcionario”, no entanto, inicializando com new Gerente()…

Na minha cabeça não fica claro o que realmente é “criado”.

Obrigado.

[]s

Valeu Vini !! esclareceu muita coisa !!
Zeed , Funcionario f = New Gerente () // polimorfismo …

o Gerente e um funcionario?? sim , porem como o vini falo nem todo funcionario e um gerente …

a sei la estou aprendendo tambem , e aos poucos irei ajudar aqui na comunidade conforme meu conhecimento for se elevando ,
pois acho que todos um dia ja foram iniciantes e precisaram de ajuda =D…

abraços Vini Thanks !!!

Funcionario f = new Gerente();

Você diz:
“Ei, java, estou criando uma variável do tipo funcionário, e seu conteúdo é um gerente, blz?”

É como dizer:
“Ei rapaz, pense num animal.”

E depois eu te pergunto:
“Em que animal vc pensou?”

Vc jamais vai pensar num animal genérico, vc sempre vai responder uma instância específica de animal. Digamos um gato:

Animal animalQuePensei = new Gato();

Boa tarde Galera !

ViniGodoy, como diria meu amigo Jack, vamos por partes !

Seguindo seu exemplo:

Você diz:
“Ei, java, estou criando uma variável do tipo funcionário, e seu conteúdo é um gerente, blz?”

Quer dizer que estou avisando ao Java que to criando um funcionario e colocanco um Gerente dentro dele ? Ok ?

Mas quando você disse:
[i]“Ei rapaz, pense num animal.”

E depois eu te pergunto:
“Em que animal vc pensou?” [/i]

Quem é o rapaz ? Eu ou o Java ?

Sério agora…
Quando você faz:

Animal animalQuePensei = new Gato();  

Não esta explicito que o Animal é um Gato ?

Acredito que não, porque se fosse assim, o Cast seria desnecessário…

OU

Na realidade, aqui:

Animal animalQuePensei 

É a parte do “Pense em um Animal”

Aqui:

new Gato();  

É a parte onde eu pensei num Gato

E aqui:

((Gato) animalQuePensei).setMiar()

É a reposta: Pensei num gato, logo você pode mandá-lo miar…

[]s

Ok.

[quote=Zeed01]
Mas quando você disse:
[i]“Ei rapaz, pense num animal.”

E depois eu te pergunto:
“Em que animal vc pensou?” [/quote]

O rapaz é vc mesmo. É só para mostrar que nós também usamos classes, no dia-a-dia. Nós podemos classificar qualquer animal como “um animal”, pois também trabalhamos com esse conceito. A ligua permite que nos referenciemos a uma coisa abstrata, embora na prática, iremos nos referir a instâncias concretas. Aliás, nós até trabalhamos com polimorfismo. Eu poderia perguntar para vc:
“Que barulho faz o animal que vc pensou?”

Note que “fazer barulho” é uma característica comum a todos os animais. Por isso, vc responderia “Miau!”.
Isso é equivalente a fazer:
animal.barulho();
E o java imprimir o miau.

A linguagem de programação nos permite a mesma coisa. Quando declaramos uma variável, estamos criando apenas uma referência, um apontador a alguma coisa, do tipo daquela variável. Mas essa coisa sempre terá um tipo específico. No caso de uma variável para animais, um Gato ou um Cachorro. No caso de uma variável para Funcionarios um Gerente ou um Empregado.

[quote]Quando você faz:

Animal animalQuePensei = new Gato();

Não esta explicito que o Animal é um Gato ? [/quote]

Sim, está explicito. Entretanto, o java é burro, limitado, e irá tratar a referência de acordo com o tipo da referência. Pois para ele, a única coisa 100% segura sobre uma variável que guarda um Animal, é que tem um animal lá dentro, não que ele necessariamente é um gato. Claro, como esse código inclui a declaração e a atribuição, fica fácil perceber o que tem dentro da variável. Mas lembre-se que poderia não ser tão claro assim:

[code]public static void mostrarNome(Animal animal) {
System.out.println(“O nome do animal é:” + a);
}

public static void main(String args[]) {
mostrarNome(new Gato());
}[/code]

Aqui, por mais que seja óbvio, fica difícil para o java garantir que a função mostrar nome sempre será chamada com um gato.

Se vc quisesse ali colocar um código específico do gato, seria obrigado a fazer um cast. Como o cast não é uma operação segura, seria também obrigado a testar o tipo com o instanceof:

public static void mostrarNome(Animal animal) { if (animal instanceof Gato) { System.out.println("O nome do gato é:" + a + " e ele faz " + ((Gato)a).ronronar()); else System.out.println("O nome do animal é:" + a); }

Afinal, não saberemos que o animal é um gato a menos que perguntemos explicitamente.

Boa tarde Galera !

Mãe do céu !
Isso é que é aula !

Obrigado pela sua paciência e disponibilidade em ajudar !

Um grande abraço !

Olá Rasarib,

tenta fazer assim, tmb da certo…

... Gerente f = (Gerente) new Funcionario(); ...