Java, 102 95 89 88 78 байт
class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>a=new B<>();}
Это заканчивается тем, StackOverflowErrorчто происходит, потому что универсальная система разрешения не может определить корень, для которого нужно разрешить другие обобщенные элементы.
Кредиты, причитающиеся .
Что здесь происходит?
A<T>просто там, чтобы иметь 1-буквенный родитель. Это универсально. Я мог бы использовать List, но импорт и повторение 4 букв слишком длинные.
B<T> объявляет базовый общий.
B extends Aтребуется иметь иерархию между Bи A.
extends A<A>создает собственную ссылку на A<T>.
A<? super B> запускает поиск дженериков на A<T>
B<B<T>>создает самореференцию на B<T>.
A<...> a=new B<>()форсирует использование обобщений, а не просто их определение, форсирует разрешение при компиляции B, а не после.
A<?super Bсоздает несамостоятельную ссылку, поэтому мы имеем ссылку как на один тип, так и на другой в обобщениях A.
B<A>создает несамостоятельную ссылку, поэтому мы имеем ссылку как на один тип, так и на другой в обобщениях B.
Теперь тип Aимеет тип generics Aи B, но какой выбрать? Забудьте о себе, давайте попробуем решить B. Пинг.
Хорошо, Bесть тип дженериков Aи B, но какой выбрать? Забудьте о себе, давайте попробуем решить A. Pong.
Этот вид рекурсии не может на самом деле следует избегать , потому что есть законные случаи , как A<B<A<B<A<B<Object>>>>>>: например , объект JSON: List<Map<String,Map<String,List<Map<String,List<String>>>>>>.
Результат компиляции
$ javac NoCompile.java
The system is out of resources.
Consult the following stack trace for details.
java.lang.StackOverflowError
at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3260)
at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2587)
at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)
at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3260)
at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2592)
at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)
В моей системе трассировка стека останавливается после отображения 1024 строк, которые на самом деле являются 4 одинаковыми строками, повторенными 256 раз, что доказывает бесконечную рекурсию. Я избавлю тебя от всего этого следа.
экономия
- 102 → 95 байт: заменено
interface+ implementsна class+ extends.
- 95 → 89 байт: заменено
Longна A(дважды).
- 89 → 88 байт: оператор бриллианта (
new B<A>()→ new B<>()).
- 88 → 78 байт: перемещено объявление переменной члену класса, благодаря VoteToClose .