Pergunta Generics

[code]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&#40;A a2 &#58; l&#41; &#123;
		System.out.println&#40;a2.a&#41;;
	&#125;
&#125;

}[/code]

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:

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.

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

Outro Exemplo:

[code]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&#40;A a2 &#58; l&#41; &#123;
     a2.metodo&#40;&#41;;
  &#125;

}
}[/code]

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