Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Quando o cast é necessário > Exercício 4???

Gostaria de saber como se lê este cast do exemplo do código do exercício?

Abaixo segue como eu leio um cast simples, como devo ler o cast do código do exercício abaixo? Ex.: Object o = (Object) "teste"== O texto "teste" que é uma string é um object: Sim

interface Z {}
interface W {}
interface Y extends Z, W {}
class B {}
class C extends B implements Y {}
class D extends B implements Z, W {}
class E extends C {}
class A {
    public static void main(String[] args) {
        D d = (D) (Y) (B) new D();
    }
}
4 respostas

Boa tarde Wagner, seguinte, o Cast acontece quando precisamos dizer ao compilador que p tipo no nosso objeto tambem é do tipo que queremos fazer um Cast, por exemplo: Temos a classe Animal e a classe Cao que extende Animal, logo, todo Cao é um Animal, então podemos fazer o Cast. Nessa caso você está dizendo que D tbm é do tipo B e Y, mas na verdade não é, porque D extends B mas não implementa Y.

Essas questões são confusas mesmo, minha dica é treinar um pouco com obejtos conhecidos como animais, automoveis, pra poder pegar bem o conceito.

Boa tarde Guilherme, entendi sua questão, este exemplo que passou e bastante claro, é muito semelhante aos do vídeo, os exemplos do videos são todos muito claros, mas quando se trata dos exercícios, vemos situações que não foram exatamente abordadas no vídeo, o que nos obriga a abstrair mais um pouco o entendimento, pensar um pouco mais, então eu acabei ficando com muita dúvida na forma correta de se ler o CAST para entender que perguntas devo fazer para entender a questão.

No trecho de código simples abaixo, é fácil de entender porque o compilador conseguiu compilar, na minha leitura eu faço da seguinte forma:

A variável "v" que é de um tipo Veiculo só pode ser convertida para Moto se o objeto para o qual ela referência, ou seja, que foi dado um new, herda de Veiculo, ou seja, se Moto herda de Veiculo.

Então neste exemplo eu leio da direita para esquerda, ou seja, eu quero "converter" tipo da classe da direita para o tipo da classe da esquerda que está entre os parenteses "(Moto)",

class Veiculo{}
class Moto extends Veiculo{}
class Carro extends Veiculo{}

public class ZTeste {

    public static void main(String[] args) {
        Veiculo v= new Carro();
        Moto m = (Moto) v;

    }

}

Sendo assim para o código em questão que informei antes:

D d = (D) (Y) (B) new D();

eu gostaria de entender de devo ler algo tipo assim:

(Y) pode ser "convertido" para (D) e (B) pode ser "convertido" para (Y) e new D() pode ser "convertido" para (B)???

OU eu deveria ler

(Y) pode ser "convertido" para (D) e (B) pode ser "convertido" para (D) e new D() pode ser "convertido" para (D)???

Estudei mais um pouco para entender e acho que entendi perfeitamente agora a forma de ler, pelo menos nas simulações que fiz funcionou. A forma para ler o CAST abaixo é: new D() é um (B)? R:Sim, new D() pode implementar (Y)? R:Sim, contanto que new (D) não seja final, new D() é um (D) e pode ser referenciado por uma variável d do tipo D? R:Sim. Correto?

D d = (D) (Y) (B) new D();

Obs.: Embora tudo compile, como D não implementa Y dá uma exception ao executar.

solução

Wagner no caso ' new D() pode implementar (Y)? R:Sim' na verdade no cast voce ta assumindo que D pode implementa Y, o que não é verdade, por isso nao roda.