Coloquei o ? por que na especificação a ? siginifica qualquer class, assim evita o warning de compilação.
? é para conjunto e nao para vc definir tipos de genericos… vc pode usar qualquer identificador valido e ? nao é um identificador valido.
Vc está confudindo usar isso:
List<?>lista=newArrayList<Integer>();
com seu codigo acima… é algo complentamente diferente…