Периодически на хабре можно встретить статьи о том, какие невероятные вещи можно сделать на шаблонах C++: [конечные автоматы][1], [лямбда-исчисление][2], [машина Тьюринга][3] и многое другое.
Параметризованные типы в Java традиционно считаются лишь пародией на шаблоны C++ (несмотря на то, что их даже сравнивать как-то некорректно), и причины этого несложно понять. Тем не менее не всё так плохо, и компилятор Java можно заставить производить во время проверки типов любые вычисления, лишь бы хватило оперативной памяти. Конкретный способ это сделать был описан в ноябре 2016-го года в [этой прекрасной публикации][4]. Его я и хотел бы объяснить.
Для затравки приведу следующий код. Корректен ли он? Предлагаю скомпилировать и проверить, угадали ли вы результат.
class Sample {
interface BadList {}
public static void main(String[] args) {
BadList badList = null;
List list = badList;
}
}
**Узнать ответ**
Компилятор выбросит `java.lang.StackOverflowError` независимо от размера стэка.
Разберёмся, почему компилятор ведёт себя именно так (я бы не назвал это багом), как понимание данных причин может быть полезно и причём тут машина Тьюринга.
[Читать дальше →][5]
[1]:
https://habrahabr.ru/post/179089/
[2]:
https://habrahabr.ru/post/218341/
[3]:
https://habrahabr.ru/post/279745/
[4]:
https://arxiv.org/pdf/1605.05274.pdf
[5]:
https://habrahabr.ru/post/330724/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut