Обобщения, параметры типа и подстановочные знаки

Я пытаюсь понять Java-дженерики, и они кажутся чрезвычайно сложными для понимания. Например, это нормально ...

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) { }
}

Может кто-нибудь объяснить, что происходит на простом языке?

Ответы на вопрос(1)

Ваш ответ на вопрос