Método com Genéricos

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á?

o method doStuff void declarado com <? super Foo>
o ArrayList ira aceitar apenas um ArrayList como este

  • ou seja apenas de classes que sejam pai de Foo

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.

Verdade, que erro mais bobo, mais com os genéricos acabei nem prestando atenção nisso, valew gente!