Olá pessoas, enquanto estava estudando Genéricos e Coleções me surgiu uma dúvida com o seguinte código:
import java.util.*;
class Test {
public static void main(String[] args) {
List<Foo> fooList = new ArrayList<Foo>();
Foo foo = new Foo();
foo.doStuff(fooList);
}
}
class Foo {
void doStuff(ArrayList<? super Foo> foo) { // Compila se for um "List" ao invés de um "ArrayList"
foo.add(new Bar());
System.out.println("doStuff");
}
}
class Bar extends Foo {
}
Qual o motivo do método “doStuff()” não compilar da maneira que está?
Essa questão na verdade é sobre polimorfismo e o generics aí só atrapalha (a parte do generics em si tá certa).
Se você olhar a variavel fooList na linha 5, vai ver que o tipo dela é “List”. Sabemos que o objeto é “ArrayList” ja que demos new, maso tipo da variavel pro Java é List simples mesmo.
Aí quando voce tenta passar como argumento pra um cara que recebe ArrayList, vai dar tipos incompativeis. List é mais abrangente que ArrayList, nem todo List é um ArrayList.