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 StackOverflowError
yang 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 A
diperlukan untuk memiliki hierarki antara B
dan 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 B
menciptakan 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 A
memiliki tipe generik A
dan B
, tetapi mana yang harus dipilih? Lupakan tentang diri, mari kita coba untuk menyelesaikannya B
. Ping.
Oke, B
punya tipe obat generik A
dan 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
+ implements
dengan class
+ extends
.
- 95 → 89 byte: diganti
Long
dengan 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 .