Atribuição de Arrays em Run Time

7 respostas
Jaba

Pessoal, mais uma duvida pintou nesse caminho para a certificação.

No seguinte código:

class A{} class B extends A{} class C extends B{} class D extends C{} public class AtribuicaoArray{ public static void main(String args[]){ A[] a=new C[1]; a[0] = new A(); } }

Acontece um erro em Run Time.
O programa compila porque o array é do tipo “A” e estou criando um “A” nesse indice.
Mas em RunTime, esse indice se transforma em um tipo “C”, por isso não aceita um “A”? Existe esse tipo de polimorfismo em RunTime?
Porque pra mim, até agora, isso era normal, porque o array é do tipo “A”, e não do tipo “C”.

Valew de novo, Galera!

7 Respostas

R

to tentando rodar aqui,

deu um

compile-single:

run-single:

Exception in thread “main” java.lang.ArrayStoreException: <a href="http://testes2.As">testes2.As</a>

at testes2.A.main(A.java:20)

Java Result: 1

EXECUTADO COM SUCESSO (tempo total: 0 segundos)
class As{}

class B extends As{}

class C extends B{}

class D extends C{}
public class A{

public static void main(String args[]){

As[] a=new C[1];

a[0] = new As();
System.out.println("AAA"+a[0]);
 }

}

Jaba

Não entendi o que você quis dizer :?

marciosouzajunior

Olá! Também to nesse caminho e acho q posso lhe ajudar:

Quando você faz isso:

A[] a = new C[1];

Como C é subclasse de A (na verdade é subclasse de B, mas B é de A então C também é), então você pode fazer com que um objeto mais genérico aponte para um mais específico. Mas isso não é a resposta ainda, só estou justificando que a declaração está correta.
O que acontece é que você cria um espaço na memória (já que o array so tem um elemento) que pode armazenar um objeto do tipo de C. Acho que aí você já matou a questão, porque na segunda linha você escreveu:

a[0] = new A();

Então o problema é esse: Inserir um objeto do tipo A num “conteiner” tipo C. Como A não é subclasse de C (é o contrário), então isso não é possível. Por isso ele lançou a excessão java.lang.ArrayStoreException.

Espero ter ajudado!

E

Esse recurso do Java (indicar que se C é subclasse de A, então C[] é subclasse de A[] ) foi copiado pelo C#, mas ambas as linguagens têm problemas com isso.

Uma das coisas que ocorre é exatamente essa (a verificação do tipo é feita em runtime, e ocorre um erro de runtime em vez de um de compilação quando você tenta fazer exatamente isso que você tentou - empurrar um elemento A em um array de C[], sendo que um array de C[] pode só conter dados da classe C ou de uma subclasse de C, não de uma superclasse de C).

Em Scala, esse tipo de coisa (se C é subclasse de A, então C[] é subclasse de A[]) não é verdade de propósito, e não foi copiada do Java porque o autor da linguagem já sabia desse problema e quis evitar esse tipo de surpresa.

Jaba

Mais ai é que tá, o array não é do tipo C[], é do tipo A[].

Jaba

Up no topico!

Desculpa se eu estiver sendo ignorante não vendo alguma coisa ou sendo burro mesmo, galera, mas eu não entendi a lógica desse código.

Valew!

ViniGodoy

Esse tipo de polimorfismo não existe.

Uma lista de C[] não é implicitamente convertível para uma lista de As.
Imagine que temos 3 classes A (pai de todos), B (filha de A), e C (filha de A).

Se seu polimorfismo fosse possível, daria pra fazer essa besteira aqui:

A[] x = new C[10];
x[0] = new B(); //A variável A[] aceita um B dentro, mas o array C[] não!
Criado 20 de outubro de 2010
Ultima resposta 23 de out. de 2010
Respostas 7
Participantes 5