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
จะต้องมีลำดับชั้นระหว่างและB
A
extends A<A>
A<T>
สร้างอ้างอิงตนเอง
A<? super B>
เรียกการค้นหาสำหรับข้อมูลทั่วไปเกี่ยวกับ A<T>
B<B<T>>
B<T>
สร้างอ้างอิงตนเอง
A<...> a=new B<>()
บังคับให้มีการใช้ยาชื่อสามัญแทนคำจำกัดความเหล่านั้นบังคับให้มีการลงมติเมื่อรวบรวมB
และไม่ใช่หลังจากนั้น
A<?super B
A
สร้างที่ไม่ใช่ตัวเองอ้างอิงดังนั้นเราจึงมีทั้งการอ้างอิงถึงประเภทหนึ่งและไปยังอีกในยาชื่อสามัญของ
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
กับ+class
extends
- 95 → 89 ไบต์: แทนที่
Long
ด้วยA
(สองครั้ง)
- 89 → 88 ไบต์: ตัวดำเนินการเพชรที่ใช้แล้ว (
new B<A>()
→ new B<>()
)
- 88 → 78 ไบต์: ย้ายการประกาศตัวแปรให้กับสมาชิกระดับขอบคุณVoteToClose