Рассмотрим следующий пример:
public final class Main<T extends Main<T>> {
public static void main(String[] args) {
Main<?> main = new Main<>();
}
}
Это прекрасно компилируется. Однако, когда я пытаюсь выполнить эту компиляцию без использования алмаза, единственный способ заставить его работать - это использовать сырой тип.
Main<?> main = new Main();
Попытки без сырых типов не работают:
Main<?> main = new Main<?>(); // None of
Main<?> main = new Main<Main<?>>(); // these
Main<?> main = new Main<Main<Main<?>>>(); // compile
Так почему же работает оригинальная версия с бриллиантом? Что такое выведенный тип при написании Main<?> main = new Main<>();
?
Является ли это вывод необработанного типа или он выводит какой-то бесконечно вложенный тип, подобный этому?
Main<Main<Main<Main<...>>>>