2011-05-27 16 views
6

Java VM specification में एक नज़र डालने के बाद, मैंने देखा कि पहचानकर्ता बनाने के लिए केवल ASCII अक्षरों से बहुत अधिक उपयोग किया जा सकता है।ट्रू जावा जेनेरिक (टेम्पलेट्स)

सबसे पहले, मैं अगर कोई अतिरिक्त प्रतीकों ($ से अलग, कि पहचानकर्ता के लिए उपलब्ध हैं)

क्या आपको लगता है, संभव होगा विस्तारित चरित्र के साथ एक पहचानकर्ता में अतिरिक्त जानकारी के सांकेतिक शब्दों में बदलना करने के लिए सेट कर रहे थे सोच रहा था , और एक कस्टम क्लासलोडर, सही जावा जेनरिक लागू करने के लिए?

बेशक, आपको चारों ओर टाइप एरर प्राप्त करना होगा, लेकिन कस्टम पार्सर के साथ यह संभव हो सकता है? के रूप में मैं मूल कार्यान्वयन को संशोधित करने का इरादा नहीं $g$GenericList$_Java_lang_String$

मैं GenericList यहाँ उपयोग कर रहा हूँ:

तो आप की तरह एक प्रारूप में जेनेरिक नाम संग्रहीत कर सकती है!

उन्हें कक्षा लोडर के साथ लोड करें, उचित GenericList<String> संस्करण बनाएं और इसे वापस भेजें।

संपादित करें: मैं उस भाषा के लिए इसका उपयोग करने की योजना बना रहा हूं जिसे मैं JVM पर बना रहा हूं। चूंकि यह $ और _ के विशेष वर्णों के रूप में उपयोग करता है, इस तरह की एन्कोडिंग जानकारी बस काम कर सकती है!

संपादित करें 2: मुझे लगता है कि करने के लिए और अधिक कठिन काम सामान्य तरीकों से होगा? क्या किसी के पास कोई जानकारी है कि उन्हें कैसे लागू किया जाएगा?

संपादित करें 3: कक्षाएं केवल उतार दिया जा सकता है कब से classloader गायब हो जाता है, मैं कैश और जैसे कि यह नेट में काम करता है संकल्प लिया टेम्पलेट्स को दूर करने में सक्षम हो जाएगा, या मैं इसे सी ++ की तरह करना होगा?

+1

+1, दिलचस्प विचार। .NET IL पर एक नज़र डालना सुनिश्चित करें, जो जेनरिक्स को टाइप एरर के बिना लागू करने के लिए एक समान अवधारणा का उपयोग करता है (वहां, चरित्र '(बैकटिक) का उपयोग पहचानकर्ताओं में जेनेरिक पैरामीटर को सीमित करने के लिए किया जाता है)। –

+0

मैं वास्तव में रोटर (एसएससीआईएल) देख रहा हूं, जो बहुत ही रोचक है। मेरी समस्या यह है कि मैं प्रत्येक जेनेरिक आइसेंटेंस के कैशिंग और टाइम-टू-लाइव को कैसे कार्यान्वित करता हूं – Darkzaelus

उत्तर

2

JVM / को छोड़कर वर्ग/फ़ील्ड/विधि नामों में किसी भी वर्ण की अनुमति देता है, और ; जिसका विशेष अर्थ है। संख्याओं और अन्य पात्रों का उपयोग करना obfuscators को संकलन को कठिन बनाने के लिए आम है।

हालांकि आप उत्पन्न वर्ग/फ़ील्ड/विधियों के लिए $ और _ का उपयोग कर सकते हैं।

नोट: जेडीके 7 को कक्षा और जेनेरिक के संयोजन के साथ Type के साथ बेहतर सामान्य समर्थन होना चाहिए।

संपादित करें:

एक तरह से उचित जेनेरिक प्रकार के लिए हमेशा

Set<String> set = new LinkedHashSet<String>() { }; 

{ } के उपयोग के एक अनाम वर्ग जो सामान्य आप चाहते हैं के साथ एक माता पिता के प्रकार है बनाता है उपयोग करने के लिए है। आप इस जानकारी को प्रतिबिंब के माध्यम से प्राप्त कर सकते हैं।

आप अपनी खुद की कक्षा लोडर रखने के द्वारा कक्षा को कैश और हटा सकते हैं जिसे आप अपनी इच्छानुसार निपटान करते हैं। सबसे चरम मामले प्रति वर्ग क्लासलोडर होगा।

एक बार जब आप अपने सामान्य प्रकार के होते हैं, तो आप इन तरीकों का उपयोग सामान्य प्रकारों जैसे ही कर सकते हैं।

+1

बहुत रोचक ... संभावनाओं की एक अच्छी श्रृंखला खुलती है! दुर्भाग्यवश, मैं जावा 7 वाले ग्राहकों पर भरोसा नहीं कर सकता, इसलिए मुझे – Darkzaelus

+0

होने के लिए मेरे पास जो कुछ है, उसके साथ काम करना होगा '{}' front! क्या आपको पता है कि कक्षाओं के बीच कक्षाओं को स्थानांतरित करना संभव है? – Darkzaelus

+0

इसके साथ एक समस्या, अभी भी जांच काम टाइप करेंगे? – Darkzaelus

0

जैसा कि आप यूनिकोड का उपयोग कर सकते हैं, आप मूल रूप से पिछले उत्तर (/ ,;) में वर्णित कुछ अक्षरों को छोड़कर सब कुछ उपयोग कर सकते हैं। "सच्चे जेनेरिक" बीटीडब्ल्यू की तरह कोई संकेत नहीं है ... मुझे पता है कि आपका क्या मतलब है; डी और इसे "टेम्पलेट्स" कहा जाता है।

+0

मुझे पता है कि यह भयानक है, मैं सोच रहा था कि बुनियादी कार्यवाही करना संभव हो सकता है! – Darkzaelus

0

हाँ आप जावा में पहचानकर्ता नाम के रूप में किसी भी यूनिकोड चरित्र का उपयोग कर सकते हैं। जावा में अनुमत पहचानकर्ता नामों के लिए here देखें। लेकिन जैसा कि पिछले उत्तर में बताया गया है, आपका मतलब है "सच्चे जेनेरिक" के लिए "टेम्पलेट्स"।

संबंधित मुद्दे