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має тип дженериків Aі B, але який повинен бути обраний? Забудь про себе, спробуймо вирішити B. Пінг.
Добре, Bмає тип дженериків Aі B, але який повинен бути обраний? Забудь про себе, спробуймо вирішити A. Понг.
Такого роду рекурсії реально не уникнути, оскільки існують законні випадки, наприклад 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 .