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 .