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, StackOverflowErrorwas 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 Amuss eine Hierarchie zwischen Bund 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 Bund nicht danach.
A<?super Berstellt 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 Ahat generischen Typ Aund B, aber welcher ist zu wählen? Vergessen Sie sich selbst, versuchen wir es zu lösen B. Klingeln.
Okay, Bhat Generika Typ Aund 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+ implementsdurch class+ ersetzt extends.
- 95 → 89 Bytes: ersetzt
Longdurch A(zweimal).
- 89 → 88 Bytes: Verwendeter Diamantoperator (
new B<A>()→ new B<>()).
- 88 → 78 Bytes: Die Variablendeklaration wurde dank VoteToClose in ein Klassenmitglied verschoben .