Genéricos, parâmetros de tipo e caracteres curinga

Estou tentando entender os genéricos java e eles parecem extremamente difíceis de entender. Por exemplo, isso é bom ...

public class Main {

    public static void main(String[] args) {
        List<?> list = null;
        method(list);
    }

    public static <T> void method(List<T> list) { }
}

... como é isso ...

public class Main {

    public static void main(String[] args) {
        List<List<?>> list = null;
        method(list);
    }

    public static <T> void method(List<T> list) { }
}

... e isto ...

public class Main {

    public static void main(String[] args) {
        List<List<List<?>>> list = null;
        method(list);
    }

    public static <T> void method(List<List<T>> list) { }
}

... mas isso não compila:

public class Main {

    public static void main(String[] args) {
        List<List<?>> list = null;
        method(list);
    }

    public static <T> void method(List<List<T>> list) { }
}

Alguém pode explicar o que está acontecendo em linguagem simples?

questionAnswers(1)

yourAnswerToTheQuestion