जावा, 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 के लिए धन्यवाद, एक वर्ग के सदस्य के लिए चर घोषणा को स्थानांतरित किया ।