Estou estudando o funcionamento dos WildCards, mas estou com uma duvida, aonde eu comentei como SAMPLE 3 gostaria de saber
oque que eu posso colocar dentro daquelas duas listas , e se alguem pudesse me dar um exemplo de codigo agradeceria, pois ja tentei algumas coisas e nao deu certo.
import java.util.ArrayList;
import java.util.List;
public class Collections2 {
public static void main(String[] args) {
//SAMPLE 1
List<Integer> arrayInteger = new ArrayList<Integer>();
arrayInteger.add(1);
arrayInteger.add(2);
arrayInteger.add(3);
List<List<Integer>> table = new ArrayList<List<Integer>>();
table.add(arrayInteger);
//SAMPLE 2
Collections2 c1 = new Collections2();
Collections2 c2 = new Collections2();
List<Object> arrayObject = new ArrayList<Object>();
arrayObject.add(c1);
arrayObject.add(c2);
List<List<Object>> tableObj = new ArrayList<List<Object>>();
tableObj.add(arrayObject);
//SAMPLE 3
List<? extends List< Number>> tableNumber = new ArrayList();
//tableNumber.add(table);
List<List<? extends Number>> tableNumber2 = new ArrayList();
}
}
Vc não pode incluir nada em listas com WildCards do tipo: ? extends Class
Por que?
Porque isso é valido:
List<? extends Number> l = new ArrayList<Integer>();
Uma lista de algo que extends Number pode ser uma lista de integer, float, double etc.
Vc tem certeza de que o que está ali dentro é no minimo um Number, por isso o get retorna Number, mas não tem certeza exatamente do tipo que seu objeto (ArrayList) é, qual subtipo de Number ArrayList é, então não pode adicionar um Integer pois se o ArrayList for de Float, vai dar pau.
É mais ou menos isso hehe tanto que os wildcards vc só pode usar para as referencias e não para criar objetos: new ArrayList<? extends Number>() não funciona, pois o objeto tem que ser de apenas um tipo
Exemplos praticos disso seria algo como:
public static void main(String[] args) {
final List<Integer> l1 = new ArrayList<Integer>();
l1.add(1);
l1.add(2);
l1.add(3);
final List<Double> l2 = new ArrayList<Double>();
l2.add(4D);
l2.add(5D);
l2.add(6D);
listaNumeros(l1);
listaNumeros(l2);
}
static void listaNumeros(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
}
Ou seja, crio métodos que recebem uma lista de algo que eu sei, mas essas listas podem ser de subtipos (e como não sei qual é o subtipo exatamente, eu não posso incluir nada ali dentro)
Ah, e não necessariamente se usa wildcards apenas com collection, por exemplo, quero criar um método que só receba classes que são do tipo Number:
static <T extends Number> void print(Class<T> classeDeNumber) {
System.out.println(number);
}
public static void main(String[] args) {
print(Integer.class);
print(Float.class);
print(String.class); //isso da erro de compilação
}
Muito obrigado pela explicacao, ajudou bastante sim , agora entendi que o conceito de usar ? extends justamente eh usado para passagem de parametros em metodos metodos ou para tipos de retorno de metodos e nao para criar colecoes.