A upcasting é permitida em Java, mas a downcasting gera um erro de compilação.
O erro de compilação pode ser removido adicionando uma conversão, mas seria interrompido no tempo de execução.
Nesse caso, por que o Java permite o downcasting se não pode ser executado no tempo de execução?
Existe algum uso prático para esse conceito?
public class demo {
public static void main(String a[]) {
B b = (B) new A(); // compiles with the cast,
// but runtime exception - java.lang.ClassCastException
}
}
class A {
public void draw() {
System.out.println("1");
}
public void draw1() {
System.out.println("2");
}
}
class B extends A {
public void draw() {
System.out.println("3");
}
public void draw2() {
System.out.println("4");
}
}
Respostas:
A downcasting é permitida quando existe a possibilidade de êxito no tempo de execução:
Em alguns casos, isso não terá êxito:
Quando um elenco (como este último) falha no tempo de execução, um
ClassCastException
será lançado.Em outros casos, ele funcionará:
Observe que algumas transmissões não serão permitidas no momento da compilação, porque nunca terão êxito:
fonte
Object o = new Object(); String s = (String) o;
Está funcionando bem para mim ..: O Como?Usando seu exemplo, você pode fazer:
fonte
Eu acredito que isso se aplica a todos os idiomas estaticamente tipados:
O typecast efetivamente diz: assuma que essa é uma referência à classe de elenco e use-a como tal. Agora, digamos que o é realmente um número inteiro, supondo que essa seja uma string não faz sentido e dará resultados inesperados; portanto, é necessário haver uma verificação de tempo de execução e uma exceção para notificar o ambiente de tempo de execução de que algo está errado.
No uso prático, você pode escrever código trabalhando em uma classe mais geral, mas convertê-lo em uma subclasse se souber qual é a subclasse e precisar tratá-lo como tal. Um exemplo típico é substituir Object.equals (). Suponha que tenhamos uma aula para carro:
fonte
Todos nós podemos ver que o código que você forneceu não funcionará em tempo de execução. Isso porque sabemos que a expressão nunca
new A()
pode ser um objeto do tipo .B
Mas não é assim que o compilador o vê. No momento em que o compilador está verificando se o elenco é permitido, ele apenas vê o seguinte:
E como outros demonstraram, esse tipo de elenco é perfeitamente legal. A expressão à direita poderia muito bem ser avaliada para um objeto do tipo
B
. O compilador vê issoA
eB
tem uma relação de subtipo, portanto, com a visualização "expressão" do código, a conversão pode funcionar.O compilador não considera o caso especial quando sabe exatamente que tipo de objeto
expression_of_type_A
realmente terá. Ele apenas vê o tipo estático comoA
e considera que o tipo dinâmico pode serA
ou qualquer descendente deA
, inclusiveB
.fonte
Eu acredito que isso ocorre porque não há como o compilador saber em tempo de compilação se o elenco será bem-sucedido ou não. Para o seu exemplo, é simples ver que o elenco falhará, mas há outros momentos em que não é tão claro.
Por exemplo, imagine que os tipos B, C e D estendem o tipo A e, em seguida, um método
public A getSomeA()
retorna uma instância de B, C ou D, dependendo de um número gerado aleatoriamente. O compilador não pode saber para qual tipo de tempo de execução exato será retornado por esse método; portanto, se você converter os resultados posteriormenteB
, não há como saber se a conversão será bem-sucedida (ou falhará). Portanto, o compilador deve assumir que as conversões serão bem-sucedidas.fonte
@ Pôster original - ver comentários em linha.
fonte
O downcast funciona no caso em que estamos lidando com um objeto upcasted. Upcasting:
Portanto, agora essa
objValue
variável sempre pode ser baixada para,int
porque o objeto que foi lançado é umInteger
,mas porque
objValue
é um Objeto para o qual não pode ser convertido,String
porqueint
não pode ser convertido paraString
.fonte
O downcasting é muito útil no seguinte snippet de código que eu uso isso o tempo todo. Provando assim que o downcasting é útil.
Eu armazeno String na lista vinculada. Quando recupero os elementos da lista vinculada, os objetos são retornados. Para acessar os elementos como Strings (ou qualquer outro Objeto de Classe), o downcast me ajuda.
Java nos permite compilar código de downcast confiando em que estamos fazendo a coisa errada. Ainda assim, se os humanos cometem um erro, ele é pego em tempo de execução.
fonte
void*
ponteiros em C ++. Não me parece uma boa ideia.Considere o exemplo abaixo
aqui criamos o objeto da subclasse Bone e o atribuímos à referência de superclasse AOne e agora a referência de superclasse não sabe sobre o método method2 na subclasse, ou seja, Bone durante o tempo de compilação. a referência resultante pode saber sobre a presença de métodos na subclasse, ou seja, Bone
fonte
Para fazer downcasting em Java e evitar exceções em tempo de execução, faça uma referência ao seguinte código:
Aqui, Animal é a classe dos pais e Dog é a classe dos filhos.
instanceof é uma palavra-chave usada para verificar se uma variável de referência contém um determinado tipo de referência de objeto ou não.
fonte
A transformação de downcasting de objetos não é possível. Somente
é possível
fonte