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”.
Olá! Também to nesse caminho e acho q posso lhe ajudar:
Quando você faz isso:
A[]a=newC[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]=newA();
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
entanglement
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: