Cast

O que é cast e quando se deve usar?

1 curtida

O cast é uma conversão, é quando convertemos um valor de um tipo para outro tipo. Basicamente existem dois tipos de conversão(Cast), as conversões explicitas e implícitas.

Conversões Implícitas:
São as conversões que ocorrem sem nenhum cast, como por exemplo passar um valor de um tipo menor para dentro de um tipo maior. Só funciona com tipos menores para dentro de maiores, como byte para short, short para int, int para long, float para double. Também funciona de tipos inteiros para tipos flutuantes(float flutuante = inteiro), mas não o contrário(int inteiro = flutuante).

	  short a = 10; 
	  int b = a; // Jogamos a variavel short dentro de um int aqui. 

Conversões Explícitas
São as conversões feitas por nós, utilizando os comandos de cast como: (int), (byte), (double), ou métodos de conversão, veja exemplos abaixo:

	
	int inteiro = (int) dobro; 
	short num = (short) dobro; /* também: */ (byte), (long), /* ou matrizes: */ (boolean[]), (int[])
	Dog d = (Dog) animais.get(0); // (Dog) Converte um object em seu tipo real(O tipo que ele era antes de entrar no ArrayList<Animais> polimórfico).

	// Ou usando métodos:
      // Convertendo String em numero:
		int x = Integer.parseInt("2"); // String em um int
        double d = Double.parseDouble("302.10"); // String em um double
		boolean b = new Boolean("true").booleanValue(); // String em um boolean. 
         //No caso acima é preciso camuflar em um objeto antes, pois Boolean não tem um método tipo Boolean.parseBoolean()

	  // Convertendo números para String
		double d = 42.5;
		String texto = Double.toString(d); /* Outra maneira sem usar o método, é concatenando a string, exemplo: */ String texto = ""+d;
2 curtidas

esse onceito de polimorfiso é mto interessante cara, vale a pena estudar mais isso, a gente usa as vezes sem nem saber

Foi uma boa explicação, só acho que devia ter deixado mais claro o que é uma conversão de fato e o que é apenas uma atribuição a outro tipo de referência.

Isso é uma coisa:

short a = 10; int b = a;
Isso é outra:

Dog d = (Dog) animais.get(0);

E isso é outra (pode ser considerado uma conversão entre tipos, mas não tem relação com o conceito de CAST ! )

int x = Integer.parseInt("2");

Bem destacado gomesrod, realmente conversões usando os métodos das classes empacotadoras não entra no conceito de Cast cru. Mas acredito que não deixa de ser uma conversão também.

É verdade yurifw, as vezes é complicado de entender este conceito de polimorfismo. Vou tentar explicar abaixo este conceito polimorfismo aplicando o cast.

Imagine o seguinte cenário: Temos a super classe Animais, e a classe Dog e Cat que herdam Animais. Então criamos uma matriz polimorfica e guardamos nossos objetos cão e gato dentro dela:

[code]
Animals[] animals = new Animals[3]; // Criamos a matriz polimórfica para abrigar 3 objetos de subclasses.
animals[0] = new Cachorro();
animals[1] = new Gato(); // Criamos 3 objetos de subclasses de Animals e jogamos cada um dentro de uma posição da matriz polimórfica.
animals[2] = new Hipopotamo();

	animals[0].latir(); // latir é um método de Cachorro. Mas esta linha NÃO será compilada, porque a classe animals não tem este método. 
	[/code]
	Porque não compilará? Porque ao jogarmos um objeto Cachorro dentro da matriz Polimorfica Animals, é como se nosso objeto fosse envolto em uma camada Animals. Imagine nosso objeto cachorro como o chocolate, e a classe Animals como o papel da embalagem.
	O compilador não sabe que tem um chocolate dentro da embalagem. Por isso precisamos sempre converter(tirar da embalagem) nossos objetos colocados dentro de uma matriz polimórfica para poder usar seus métodos. Veja abaixo como fazê-lo:
	[code]
	((Cachorro).animals[0]).latir(); // isto é um tanto complicado entender, veja abaixo como fazer isto de uma forma mais simples

	Cachorro caoVoltou = (Cachorro) animals[0]; // Aqui nós jogamos uma cópia do objeto que está em animals[0] para dentro de nossa variavel caoVoltou, já convertendo no tipo da classe deste objeto.
	caoVoltou.latir(); // Então ja podemos chamar o método latir de caoVoltou.
	[/code]

	Ok, e se eu tivesse o método latir() abstrato dentro de animals, e um sobreposto dentro de Cachorro?
	R: Então poderíamos chamr este método normalmente sem precisar fazer a conversão
	[code]
	animals[0].latir();
	[/code]

	Espero esclarecido esta questão de matriz polimórfica e porque fazer a conversão neste caso.
1 curtida

mto boa a explicação cara, um pensamento mais basico e simplista que as vezes eu uso é o seguinte:

(continuando com seu exemplo de “cachorro extends animal”)

isso quer dizer que: onde for necessario usar um animal, eu posso usar um cachorro, mas onde for necessario um cachorro eu precisaria de cast para informar que o animal que eu estou passando é um cachorro

nem todo animal tem a capacidade de latir, entao n posso chamar esse metodo sem dizer q este animal é um cachorro.

[quote=yurifw]

nem todo animal tem a capacidade de latir, entao n posso chamar esse metodo sem dizer q este animal é um cachorro.[/quote]

Vlw yurifw, você pegou o espírito da coisa ;-D. Realmente nunca teríamos o método latir dentro de Animais, pois latir só os cães fazem. Poderiamos ter um método abstrato chamado granir(), e sobre-polo em Cachorro, dai não precisaríamos usar a conversão. O compilador ao chamar granir verá que é um método abstrato(sem corpo), e analisará o objeto dentro de Animais na matriz polimórfica para poder chamar o método sobreposto da classe correta.