Duvida com WildCards

Ola pessoal,

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
    }

Espero ter ajudado

Ola luBS,

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.

vlw.