Я пытаюсь понять java generics, и они кажутся чрезвычайно трудными для понимания. Например, это нормально...
public class Main {
    public static void main(String[] args) {
        List<?> list = null;
        method(list);
    }
    public static <T> void method(List<T> list) { }
}
... как это...
public class Main {
    public static void main(String[] args) {
        List<List<?>> list = null;
        method(list);
    }
    public static <T> void method(List<T> list) { }
}
... и это...
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) { }
}
... но это не скомпилируется:
public class Main {
    public static void main(String[] args) {
        List<List<?>> list = null;
        method(list);
    }
    public static <T> void method(List<List<T>> list) { }
}
Может кто-нибудь объяснить, что происходит на простом языке?