जावा, 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>>>>>>: उदाहरण के लिए JSON ऑब्जेक्ट List<Map<String,Map<String,List<Map<String,List<String>>>>>>:।
संकलन परिणाम
$ 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 के लिए धन्यवाद, एक वर्ग के सदस्य के लिए चर घोषणा को स्थानांतरित किया ।