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, StackOverflowError
co 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 A
wymagana jest hierarchia między B
i 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 B
tworzy 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 A
ma rodzaj ogólny A
i B
, ale który należy wybrać? Zapomnij o sobie, spróbujmy rozwiązać B
. Świst.
Okej, czy B
ma rodzaj generyczny A
i 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
+ implements
znakiem class
+ extends
.
- 95 → 89 bajtów: zastępuje
Long
się 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 .