Pergunta Generics

2 respostas
S
import java.util.ArrayList;
import java.util.List;

class A {
	String a = "A";
}
class B extends A {
	String a = "B";
}

public class Teste {
	public static void main(String[] args) {
		ArrayList<A> a = new ArrayList<A>();
		a.add(new A());
		a.add(new B());
		List<? extends A> l = a;
		
		for(A a2 : l) {
			System.out.println(a2.a);
		}
	}
}

Se compilar e executar qual será a saída e porque ???
[size="11"][color="red"]* Editado: Lembre-se de utilizar BBCode em seus códigos - Ratinho[/color][/size] :joia:

2 Respostas

P

A collection a é “type safe” do tipo A, isto é, manipula apenas objetos da Classe A.

Porem, a classe B é incluida na collection, que por sua vez estende a classe A. Isso é perfeitamente correto, pois o test IS-A é executado durante a inclusao do objeto na collection.

So que qdo o objeto é incluido na collection, é feito um cast implicito para o tipo da collection.

Por isso que qdo impresso o valor do atributo a, será exibido o conteudo atribuido na classe A.

a saida sera :
A
A

se estes ojetos fossem incluids diretamente na collection l, a saida seria diferente, como segue abaixo:
A
B

pois a collection l é tipada com td que estenda A.

S

Ae pm .. isso mesmo. Ele pega o atributo da classe A.

Outro Exemplo:

import java.util.ArrayList;
import java.util.List;

class A {
   String a = "A";
   void metodo(){
	   System.out.println(a);
   }
}
class B extends A {
   String a = "B";
   void metodo(){
	   System.out.println(a);
   }
}

public class Teste {
   public static void main(String[] args) {
      ArrayList<A> a = new ArrayList<A>();
      a.add(new A());
      a.add(new B());
      List<? extends A> l = a;
      
      for(A a2 : l) {
         a2.metodo();
      }
   }
}

nessa caso esta chamando um metodo: a2.metodo(); ... dessa forma ele vai trazer o metodo de acordo com a referencia... nesse caso a saida será:
A
B

Falow

Criado 4 de agosto de 2006
Ultima resposta 4 de ago. de 2006
Respostas 2
Participantes 2