Olá eusoufeioedai,
o método add é perigoso, pois ele pode adicionar algum tipo impróprio na coleção.
Quando você usa o coringa <?>, você está dizendo ao compilador que você vai usar qualquer tipo genérico do tipo do argumento declaro, e vai invocar apenas métodos para lerem dados, e não para [b]escreverem/b dados.
É por isso que o seu código não compila, experimente usar outra função que não modifique o conjunto. Por exemplo: [code]import java.util.List;
import java.util.LinkedList;
class Pai{}
class Filho extends Pai{}
class Filha extends Pai{}
public class Main{
public static void main(String agss[]){
List<? extends Pai> p1 = new LinkedList<Pai>(); //linha1
// p1.add(new Filho());
// p1.add(new Filha());
p1.size();
List<? super Pai> p2 = new LinkedList(); //linha2
// p2.add(new Filho());
// p2.add(new Filha());
p2.size();
}
}[/code]
Para add um objeto na coleção de uma forma segura, use a palavra super:[code]import java.util.List;
import java.util.LinkedList;
class Pai{}
class Filho extends Pai{}
class Filha extends Pai{}
public class Main{
public static void main(String agss[]){
List<? extends Pai> p1 = new LinkedList<Pai>(); //linha1
// p1.add(new Filho());
// p1.add(new Filha());
p1.size();
List<? super Filho> p2 = new LinkedList(); //linha2
p2.add(new Filho());
// p2.add(new Filha());
p2.size();
}
}[/code]
<? super Filho>
… você estará pedindo ao compilador que aceite um tipo genérico que seja um Filho ou um supertipo de Filho.
<? extends Pai>
… você estará pedindo ao compilador que aceite o tipo Pai e qualquer subtipo de Pai, apenas para leitura.
Qualquer dúvida, poste ae!
Abraço!