Java, 102 95 89 88 78 bajtów
class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>a=new B<>();}
Kończy się to, StackOverflowErrorco się dzieje, ponieważ ogólny system rozstrzygania nie może zdecydować o katalogu głównym, na podstawie którego należy rozstrzygnąć inne ogólne.
Kredyty należne .
co się tutaj stało?
A<T>jest tam, aby mieć 1-literowego rodzica. To jest ogólne. Mógłbym użyć List, ale import i powtarzanie 4 liter są zbyt długie.
B<T> deklaruje podstawowy rodzajowy.
B extends Awymagana jest hierarchia między Bi A.
extends A<A>tworzy własne odniesienie na A<T>.
A<? super B> włącza wyszukiwanie generyczne A<T>
B<B<T>>tworzy odniesienie na B<T>.
A<...> a=new B<>()wymusza użycie ogólnych, zamiast po prostu ich definicji, wymuszając rozdzielczość podczas kompilacji B, a nie później.
A<?super Btworzy brak odniesienia do siebie, więc mamy zarówno odniesienie do jednego typu, jak i do drugiego w ogólnych nazwach A.
B<A>tworzy brak odniesienia do siebie, więc mamy zarówno odniesienie do jednego typu, jak i do drugiego w ogólnych nazwach B.
Teraz typ Ama rodzaj ogólny Ai B, ale który należy wybrać? Zapomnij o sobie, spróbujmy rozwiązać B. Świst.
Okej, czy Bma rodzaj generyczny Ai B, ale który wybrać? Zapomnij o sobie, spróbujmy rozwiązać A. Pong
Ten rodzaj rekursji naprawdę nie można być unikane, ponieważ istnieją uzasadnione przypadki, takie jak A<B<A<B<A<B<Object>>>>>>na przykład: obiekt JSON: List<Map<String,Map<String,List<Map<String,List<String>>>>>>.
Wynik kompilacji
$ 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)
W moim systemie ślad stosu zatrzymuje się po wyświetleniu 1024 linii, które w rzeczywistości są 4 tymi samymi liniami powtórzonymi 256 razy, co dowodzi nieskończonej rekurencji. Oszczędzę ci cały ten ślad.
Oszczędności
- 102 → 95 bajtów: zastąpiono
interface+ implementsznakiem class+ extends.
- 95 → 89 bajtów: zastępuje
Longsię A(dwa razy).
- 89 → 88 bajtów: używany operator diamentowy (
new B<A>()→ new B<>()).
- 88 → 78 bajtów: dzięki VoteToClose przeniesiono deklarację zmiennej do członka klasy .