2011-02-10 16 views
5

वर्तमान में, मैं कुछ इस तरह है: -सामान्य वर्ग में जेनेरिक विधि नाम बनाना?

public class MyHolder<T> { 
    private T value; 

    public MyHolder(T t) { 
     this.value = t; 
    } 

    public T getValue() { 
     return first; 
    } 

    public void setValue(T t) { 
     this.first = t; 
    } 
} 
इस के साथ

, मैं इसे इस तरह उपयोग कर सकते हैं: -

MyBean bean = new MyBean(); 
MyHolder<MyBean> obj = new MyHolder<MyBean>(bean); 
obj.getValue(); // returns bean 

इसके बजाय गेटर/सेटर बुला getValue() और setValue(..) होने के लिए की है, यह भी "उत्पन्न" करना संभव है?

मूलतः, यह प्रकार में पारित के आधार पर यह getMyBean() और setMyBean(..), के लिए अच्छा होगा। दी है कि यह एक बहुत ही सरल उदाहरण है, लेकिन अगर मैं एक सामान्य धारक वर्ग कि एन सामान्य गुण लेता है बनाते हैं, तो यह होगा getValue1() या getValue2() के बजाय इसे कुछ सार्थक कहने के लिए अच्छा लगा, और इसी तरह।

धन्यवाद।

+1

आपको जेनेरिक धारक वर्ग नहीं बनाना चाहिए जो एन जेनेरिक गुण लेता है। उपयोगी नाम और उपयोगी फ़ील्ड नामों के साथ एक वास्तविक कक्षा बनाएं। – ColinD

+1

मुझे पूरा यकीन है कि इसे जिस तरह से आप चाहते थे, उसका उपयोग नहीं किया जा सका, भले ही यह संभव हो। – maaartinus

उत्तर

5

नहीं जावा में ऐसी कोई सुविधा नहीं है। मैं कल्पना भी नहीं कर सकता कि यह वाक्य रचनात्मक रूप से कैसे दिखता है ... void set<T>();? और उदाहरण के लिए गेटटर/सेटर कैसे MyHolder<? extends Number> देखेंगे?

1

नहीं, यह तब तक संभव नहीं है जब तक कि आप अपने इनपुट के आधार पर MyHolder कक्षा उत्पन्न करने के लिए किसी प्रकार का स्रोत कोड जनरेटर का उपयोग न करें।

लेकिन दूसरी तरफ, अगर आपको यह संभावना भी है, तो यह Map<String, T> का उपयोग करने से अलग कैसे होगा? तो मंगलाचरण में लिखा होगा:

MyBean bean = new MyBean(); 
MyHolder<MyBean> obj = new MyHolder<MyBean>(bean); 
obj.get('value'); 
1

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

+1

मैं नहीं कहूंगा कि इसके साथ समझौते करना है। यदि इसके लिए एक वाक्यविन्यास था, तो संकलक ऐसे विधि नाम प्राप्त कर सकता था। यह बस समर्थित नहीं है। – aioobe

+1

मुझे नहीं लगता कि मिरर इसे रोकता है क्योंकि यह पूरी तरह से संकलित-समय की बात हो सकती है जो रनटाइम उद्देश्यों के लिए मूल विधि नाम में कम हो जाती है। यह नहीं कहना है कि इस विचार के साथ अन्य समस्याओं का कोई टन नहीं है। – ColinD

+1

त्रुटियों के साथ इसके साथ थोड़ा सा संबंध है - आपके पास स्रोत कोड में 'getMyBean' विधि और संकलित कोड में क्या तरीका होगा? 'GetValue' के साथ यह संकलित नहीं होगा। तो आपको वहां 'getMyBean' रखना होगा, जिसे संशोधित किया गया है और मिटा नहीं है। – maaartinus

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