Generics en Java

Hola a todos,

Tengo una duda sobre los generics.
Cual es la diferencia entre ? (wildcard generic type) y T (formal type parameter). Tienen el mismo efecto?
Cuando debo de usar uno y cuando el otro?

Saludos y gracias.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

T es para definir

Cuando tú creas una clase (o interfaz) que quieres que use generics, usas la T (o cualquier otra letra; la T es una simple convención).
Cuando necesitas usar o devolver una clase que usa generics y no sabes qué tipo va a manejar, usas el ?.

Ejemplo de una interfaz definida por mi:

public interface Inutil<T> {

  public T hazAlgo();

}

Ejemplo usando ?:

public interface MasInutil {

  public Inutil<?> devuelveInutil();

}

Ejemplo de implementación de Inutil:

public class InutilImpl implements Inutil<String> {
  public String hazAlgo() {
    return "x";
  }
}

Ejemplo de MasInutil:

public class MasInutilImpl implements MasInutil {

  public Inutil<?> devuelveInutil() {
    //Declarar con "?" te da oportunidad a devolver otras implementaciones que tengan otra clase en vez de String
    return new InutilImpl();
  }

}

Ejemplos de uso:

Inutil<String> var1 = new InutilImpl(); //suponiendo que se declara como InutilImpl implements Inutil<String>
Inutil<?> var2 = new MasInutilImpl().devuelveInutil();