Java, 102 95 89 88 78 byte
class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>a=new B<>();}
Ini berakhir dengan StackOverflowErroryang terjadi karena sistem resolusi generik tidak dapat memutuskan root untuk menyelesaikan generik lainnya.
Kredit yang jatuh tempo .
Apa yang terjadi di sini?
A<T>hanya ada untuk memiliki 1 huruf induk. Itu generik. Saya bisa saja menggunakannya List, tetapi impor dan pengulangan 4 huruf terlalu panjang.
B<T> mendeklarasikan generik dasar.
B extends Adiperlukan untuk memiliki hierarki antara Bdan A.
extends A<A>membuat referensi diri pada A<T>.
A<? super B> memicu pencarian untuk obat aktif A<T>
B<B<T>>membuat referensi diri pada B<T>.
A<...> a=new B<>()memaksa penggunaan obat generik, bukan hanya definisi dari mereka, memaksa resolusi saat kompilasi B, dan tidak sesudahnya.
A<?super Bmenciptakan referensi-sendiri, jadi kami memiliki referensi untuk satu jenis dan yang lain dalam generik A.
B<A>menciptakan referensi-sendiri, jadi kami memiliki referensi untuk satu jenis dan yang lain dalam generik B.
Sekarang, tipe Amemiliki tipe generik Adan B, tetapi mana yang harus dipilih? Lupakan tentang diri, mari kita coba untuk menyelesaikannya B. Ping.
Oke, Bpunya tipe obat generik Adan B, tapi mana yang harus dipilih? Lupakan tentang diri, mari kita coba untuk menyelesaikannya A. Pong.
Semacam ini rekursi dapat benar-benar dihindari karena ada kasus-kasus yang sah seperti A<B<A<B<A<B<Object>>>>>>: misalnya objek JSON: List<Map<String,Map<String,List<Map<String,List<String>>>>>>.
Hasil kompilasi
$ 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)
Pada sistem saya, jejak stack berhenti setelah menunjukkan 1024 baris, yang sebenarnya adalah 4 baris yang sama diulang 256 kali, sehingga membuktikan rekursi tak terbatas. Saya akan menghindarkan Anda dari seluruh jejak itu.
Tabungan
- 102 → 95 byte: diganti
interface+ implementsdengan class+ extends.
- 95 → 89 byte: diganti
Longdengan A(dua kali).
- 89 → 88 byte: operator berlian bekas (
new B<A>()→ new B<>()).
- 88 → 78 byte: memindahkan deklarasi variabel ke anggota kelas, terima kasih kepada VoteToClose .