Java, 102 95 89 88 78 Bytes
class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>a=new B<>();}
Dies endet mit einem, StackOverflowError
was passiert, weil das generische Auflösungssystem keinen Stamm bestimmen kann, gegen den die anderen Generika aufgelöst werden sollen.
Credits sind fällig .
was geschieht hier?
A<T>
ist nur da, um einen 1-Buchstaben-Elternteil zu haben. Es ist generisch. Ich hätte es gebrauchen können List
, aber der Import und die Wiederholung von 4 Buchstaben sind zu lang.
B<T>
deklariert ein grundlegendes Generikum.
B extends A
muss eine Hierarchie zwischen B
und haben A
.
extends A<A>
Erstellt eine Selbstreferenz auf A<T>
.
A<? super B>
Löst die Suche nach Generika aus A<T>
B<B<T>>
erstellt eine Selbstreferenz auf B<T>
.
A<...> a=new B<>()
erzwingt die Verwendung der Generika, anstatt nur deren Definition, und erzwingt die Auflösung beim Kompilieren B
und nicht danach.
A<?super B
erstellt eine Nicht-Selbstreferenz, so dass wir in den Generika von sowohl eine Referenz auf einen Typ als auch auf einen anderen haben A
.
B<A>
erstellt eine Nicht-Selbstreferenz, so dass wir in den Generika von sowohl eine Referenz auf einen Typ als auch auf einen anderen haben B
.
Nun, der Typ A
hat generischen Typ A
und B
, aber welcher ist zu wählen? Vergessen Sie sich selbst, versuchen wir es zu lösen B
. Klingeln.
Okay, B
hat Generika Typ A
und B
, aber welches ist zu wählen? Vergessen Sie sich selbst, versuchen wir es zu lösen A
. Pong.
Diese Art von Rekursion kann nicht wirklich vermieden werden , weil es berechtigte Fälle wie A<B<A<B<A<B<Object>>>>>>
: zum Beispiel eines JSON - Objekt: List<Map<String,Map<String,List<Map<String,List<String>>>>>>
.
Kompilierungsergebnis
$ 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)
Auf meinem System stoppt der Stack-Trace, nachdem 1024 Zeilen angezeigt wurden. Dies sind tatsächlich die 4 gleichen Zeilen, die 256 Mal wiederholt wurden, was eine unendliche Rekursion beweist. Ich werde dir die ganze Spur ersparen.
Ersparnisse
- 102 → 95 Bytes:
interface
+ implements
durch class
+ ersetzt extends
.
- 95 → 89 Bytes: ersetzt
Long
durch A
(zweimal).
- 89 → 88 Bytes: Verwendeter Diamantoperator (
new B<A>()
→ new B<>()
).
- 88 → 78 Bytes: Die Variablendeklaration wurde dank VoteToClose in ein Klassenmitglied verschoben .