Java, 102 95 89 88 78 ไบต์
class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>a=new B<>();}
สิ่งนี้สิ้นสุดลงด้วยสิ่งStackOverflowErrorที่เกิดขึ้นเนื่องจากระบบการแก้ปัญหาทั่วไปไม่สามารถตัดสินใจได้ว่าจะให้รูทใดเพื่อแก้ไขข้อมูลทั่วไปอื่น ๆ
เครดิตที่เนื่องจาก
เกิดอะไรขึ้นที่นี่?
A<T>มีเพียงเพื่อให้มีผู้ปกครอง 1 ตัวอักษร มันเป็นเรื่องธรรมดา ฉันสามารถใช้งานได้Listแต่การนำเข้าและการทำซ้ำ 4 ตัวอักษรนั้นยาวเกินไป
B<T> ประกาศทั่วไปขั้นพื้นฐาน
B extends Aจะต้องมีลำดับชั้นระหว่างและBA
extends A<A>A<T>สร้างอ้างอิงตนเอง
A<? super B> เรียกการค้นหาสำหรับข้อมูลทั่วไปเกี่ยวกับ A<T>
B<B<T>>B<T>สร้างอ้างอิงตนเอง
A<...> a=new B<>()บังคับให้มีการใช้ยาชื่อสามัญแทนคำจำกัดความเหล่านั้นบังคับให้มีการลงมติเมื่อรวบรวมBและไม่ใช่หลังจากนั้น
A<?super BAสร้างที่ไม่ใช่ตัวเองอ้างอิงดังนั้นเราจึงมีทั้งการอ้างอิงถึงประเภทหนึ่งและไปยังอีกในยาชื่อสามัญของ
B<A>Bสร้างที่ไม่ใช่ตัวเองอ้างอิงดังนั้นเราจึงมีทั้งการอ้างอิงถึงประเภทหนึ่งและไปยังอีกในยาชื่อสามัญของ
ทีนี้รูปแบบAนี้มีประเภทยาชื่อสามัญAและBจะเลือกแบบไหนดี? Bลืมเกี่ยวกับตัวเองให้พยายามที่จะแก้ไข ปิง
ตกลงBมีประเภททั่วไปAและBแต่ที่จะเลือก? Aลืมเกี่ยวกับตัวเองให้พยายามที่จะแก้ไข สาบ
ชนิดของการเรียกซ้ำนี้ไม่สามารถจริงๆจะหลีกเลี่ยงเพราะมีกรณีถูกต้องตามกฎหมายเช่นA<B<A<B<A<B<Object>>>>>>: ยกตัวอย่างเช่นวัตถุ List<Map<String,Map<String,List<Map<String,List<String>>>>>>JSON:
ผลการรวบรวม
$ 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)
ในระบบของฉันการติดตามสแต็กจะหยุดหลังจากแสดง 1024 บรรทัดซึ่งจริงๆแล้วคือ 4 บรรทัดเดียวกันซ้ำ ๆ กัน 256 ครั้งจึงเป็นการพิสูจน์การวนซ้ำแบบไม่สิ้นสุด ฉันจะขอให้คุณติดตามทั้งหมดที่
เงินออม
- 102 → 95 ไบต์: แทนที่
interface+ implementsกับ+classextends
- 95 → 89 ไบต์: แทนที่
Longด้วยA(สองครั้ง)
- 89 → 88 ไบต์: ตัวดำเนินการเพชรที่ใช้แล้ว (
new B<A>()→ new B<>())
- 88 → 78 ไบต์: ย้ายการประกาศตัวแปรให้กับสมาชิกระดับขอบคุณVoteToClose