दिलचस्प पोस्ट
सी में हो जाता है () फ़ंक्शन क्या सीओएस त्रुटियों को पकड़ना संभव है? मैं एक नई लाइन को कैसे हटा सकता हूं अगर यह फ़ाइल में अंतिम वर्ण है? "ImportError: Google एप इंजन से dev_appserver.py के साथ _ssl नामक कोई मॉड्यूल" नहीं है कैसे एक Redux अनुप्रयोग में कोड बंटवारे के लिए reducers गतिशील लोड करने के लिए? .htaccess के साथ छवि हॉटलिंकिंग की अनुमति दें / अस्वीकार करें AngularJS के साथ एंटर दबाकर फ़ॉर्म सबमिट करें एंड्रॉइड में वैश्विक असंतुलित अपवाद हैंडलर सेट करने का आदर्श तरीका डेटा को किसी दूसरी तालिका में कॉपी करें JSlint त्रुटि 'एक लूप के भीतर कार्य न करें।' केवल जावास्क्रिप्ट के बारे में प्रश्न करता है तिथियों की एक श्रृंखला उत्पन्न करना बड़ी एक्सएलएसएक्स फाइल प्रसंस्करण फ्लेक्स आइटम सामग्री चौड़ाई लेते हैं, माता-पिता कंटेनर की चौड़ाई नहीं लम्बा बनाम बनाओ? मैं सीएसएस में केवल पाठ का पृष्ठभूमि का रंग कैसे सेट करूं?

एक सामान्य वर्ग में स्थैतिक विधि?

जावा में, मुझे कुछ ऐसा ही करना है:

class Clazz<T> { static void doIt(T object) { // shake that booty } } 

लेकिन मुझे मिल गया

  गैर-स्थिर प्रकार टी के लिए एक स्थिर संदर्भ नहीं बना सकते 

मुझे जेनेरिक मूलभूत उपयोगों से परे नहीं समझता है और इस प्रकार वह उस बारे में अधिक समझ नहीं सकता है। यह मदद नहीं करता है कि मैं इस विषय के बारे में इंटरनेट पर अधिक जानकारी प्राप्त करने में सक्षम नहीं था।

क्या कोई स्पष्ट हो सकता है कि इस तरह का उपयोग संभव है, इसी तरह से? इसके अलावा, मेरा मूल प्रयास असफल क्यों था?

वेब के समाधान से एकत्रित समाधान "एक सामान्य वर्ग में स्थैतिक विधि?"

आप स्थिर तरीकों या स्थैतिक क्षेत्रों में वर्ग के सामान्य प्रकार पैरामीटर का उपयोग नहीं कर सकते। क्लास के प्रकार पैरामीटर केवल उदाहरण विधियों और इंस्टेंस फ़ील्ड के लिए क्षेत्र में हैं। स्थैतिक क्षेत्रों और स्थैतिक तरीकों के लिए, उन्हें कक्षा के सभी उदाहरणों में भी साझा किया जाता है, यहां तक ​​कि विभिन्न प्रकार के पैरामीटर के उदाहरण भी हैं, इसलिए जाहिर है कि वे किसी विशेष प्रकार पैरामीटर पर निर्भर नहीं कर सकते हैं।

ऐसा लगता नहीं है कि आपकी समस्या को वर्ग के प्रकार पैरामीटर का उपयोग करने के लिए आवश्यक होना चाहिए। यदि आप अधिक विस्तार से करने की कोशिश कर रहे हैं, तो हम आपको यह करने के लिए एक बेहतर तरीका ढूंढने में मदद कर सकते हैं।

जावा नहीं जानता कि T क्या है जब तक आप किसी प्रकार का इन्स्तांत नहीं करते।

हो सकता है कि आप Clazz<T>.doit(something) कॉल करके स्थिर तरीकों को निष्पादित कर सकते हैं। Clazz<T>.doit(something) लेकिन Clazz<T>.doit(something) लेकिन ऐसा लगता है जैसे आप नहीं कर सकते।

चीजों को संभालने का दूसरा तरीका यह है कि विधि पैरामीटर को स्वयं पद्धति में डाल दिया जाए:

 static <U> void doIt(U object) 

जो आपको यू पर सही प्रतिबंध नहीं लेता है, लेकिन यह कुछ भी नहीं है।

मैं इस एक ही समस्या में भाग गया जावा फ्रेमवर्क में संग्रह के लिए सोर्स कोड डाउनलोड करके मुझे मेरा जवाब मिला। मैंने जिस उत्तर का इस्तेमाल किया था, वह इस पद्धति में जीनरिक को डाल दिया गया था, कक्षा परिभाषा में नहीं।

तो यह काम किया है:

 public class QuickSortArray { public static <T extends Comparable> void quickSort(T[] array, int bottom, int top){ //do it } } 

बेशक, ऊपर दिए गए उत्तरों को पढ़ने के बाद मुझे एहसास हुआ कि यह एक सामान्य वर्ग का उपयोग किए बिना एक स्वीकार्य विकल्प होगा:

 public static void quickSort(Comparable[] array, int bottom, int top){ //do it } 

अपनी doIt() पद्धति घोषित करते समय जेनेरिक तरीकों के लिए सिंटैक्स का प्रयोग करके आप क्या करना चाहते हैं doIt() के विधि हस्ताक्षर में static और void बीच के नोटिस को जोड़कर देखें):

 class Clazz<T> { static <T> void doIt(T object) { // shake that booty } } 

मुझे ग्रहण संपादक के बिना उपरोक्त कोड को स्वीकार किया Cannot make a static reference to the non-static type T त्रुटि के Cannot make a static reference to the non-static type T और फिर इसे निम्नलिखित कार्यप्रणाली (कुछ आयु-उपयुक्त सांस्कृतिक संदर्भ के साथ पूरा) करने के लिए बढ़ाया गया है:

 public class Clazz<T> { static <T> void doIt(T object) { System.out.println("shake that booty '" + object.getClass().toString() + "' !!!"); } private static class KC { } private static class SunshineBand { } public static void main(String args[]) { KC kc = new KC(); SunshineBand sunshineBand = new SunshineBand(); Clazz.doIt(kc); Clazz.doIt(sunshineBand); } } 

कौन सा कंसोल को इन लाइनों को प्रिंट करता है जब मैं इसे चलाता हूं:

उस लूट के क्लास को हिलाएं। eclipseoptions.datamanager.Clazz $ kc '!!!
उस लूट के क्लास को हिलाएं। eclipseoptions.datamanager.Clazz $ SunshineBand '!!!

दूसरों ने पहले से ही आपके प्रश्न का उत्तर दिया है, लेकिन इसके अलावा मैं O'Reilly Java Generics पुस्तक को अच्छी तरह से पुन: दर्ज कर सकता हूं। यह समय पर एक सूक्ष्म और जटिल विषय होता है, और यदि अक्सर व्यर्थ प्रतिबंध लगता है, लेकिन पुस्तक यह समझाने का एक बहुत अच्छा काम करता है कि जावा जेनेरिक कैसे वे हैं।

यह त्रुटि में सही ढंग से उल्लेख किया गया है: आप गैर-स्थिर प्रकार टी के लिए एक स्थिर संदर्भ नहीं बना सकते हैं। कारण प्रकार पैरामीटर T को किसी भी प्रकार के तर्क जैसे Clazz<String> या Clazz<integer> आदि से बदला जा सकता है। स्थैतिक फ़ील्ड / विधियां कक्षा के सभी गैर-स्थिर ऑब्जेक्ट्स द्वारा साझा की जाती हैं।

डॉक्टर से निम्नलिखित अंश लिया गया है:

कक्षा के स्थैतिक फ़ील्ड एक वर्ग-स्तरीय चर वर्ग के सभी गैर-स्थिर ऑब्जेक्ट्स द्वारा साझा की जाती है। इसलिए, प्रकार पैरामीटर के स्थैतिक फ़ील्ड की अनुमति नहीं है निम्नलिखित वर्ग पर विचार करें:

 public class MobileDevice<T> { private static T os; // ... } 

यदि प्रकार पैरामीटर के स्थैतिक फ़ील्ड की अनुमति थी, तो निम्न कोड भ्रमित होगा:

 MobileDevice<Smartphone> phone = new MobileDevice<>(); MobileDevice<Pager> pager = new MobileDevice<>(); MobileDevice<TabletPC> pc = new MobileDevice<>(); 

चूंकि स्थिर फ़ील्ड ओएस फोन, पेजर, और पीसी द्वारा साझा किया जाता है, ओएस का वास्तविक प्रकार क्या है? यह एक ही समय में स्मार्टफ़ोन, पेजर और टैबलेट पीसी नहीं हो सकता है। इसलिए, आप प्रकार पैरामीटर के स्थिर फ़ील्ड नहीं बना सकते

जैसा कि क्रिस ने अपने जवाब में सही तरीके से बताया, आपको विधि के साथ प्रकार पैरामीटर का उपयोग करने की आवश्यकता है और इस मामले में कक्षा के साथ नहीं। आप इसे इस तरह लिख सकते हैं:

 static <E> void doIt(E object) 

निम्नलिखित जैसे कुछ आपको करीब मिलेगा

 class Clazz { public static <U extends Clazz> void doIt(U thing) { } } 

संपादित करें: अधिक विस्तार से अपडेट किया गया उदाहरण

 public abstract class Thingo { public static <U extends Thingo> void doIt(U p_thingo) { p_thingo.thing(); } protected abstract void thing(); } class SubThingoOne extends Thingo { @Override protected void thing() { System.out.println("SubThingoOne"); } } class SubThingoTwo extends Thingo { @Override protected void thing() { System.out.println("SuThingoTwo"); } } public class ThingoTest { @Test public void test() { Thingo t1 = new SubThingoOne(); Thingo t2 = new SubThingoTwo(); Thingo.doIt(t1); Thingo.doIt(t2); // compile error --> Thingo.doIt(new Object()); } } 

मुझे लगता है कि यह वाक्यविन्यास अभी तक उल्लेख नहीं किया गया है (यदि आप तर्क के बिना एक विधि चाहते हैं):

 class Clazz { static <T> T doIt() { // shake that booty } } 

और कॉल:

 String str = Clazz.<String>doIt(); 

उम्मीद है कि किसी को यह मदद मिलेगी

जब आप अपने क्लास के लिए एक जेनेरिक प्रकार निर्दिष्ट करते हैं, तो जेवीएम इस बारे में जानता है कि आपके क्लास का कोई उदाहरण केवल परिभाषा नहीं है। प्रत्येक परिभाषा में केवल पैरामीट्रिजेड प्रकार है।

जेनेरिक सी ++ में टेम्पलेट्स की तरह काम करते हैं, इसलिए आपको पहले अपनी कक्षा को इन्स्तांत करना चाहिए, फिर फ़ंक्शन को निर्दिष्ट किए जा रहे प्रकार के साथ उपयोग करें

इसे साधारण शब्दों में भी डाल दिया, जेनेरिक की "मिटा" संपत्ति की वजह से ऐसा होता है। इसका मतलब यह है कि हालांकि हम ArrayList<Integer> और ArrayList<String> परिभाषित करते हैं, संकलन समय पर यह दो अलग-अलग कंक्रीट प्रकार के रूप में रहता है पर रनटाइम जेवीएम सामान्य प्रकार के मिटा देता है और दो वर्गों के बजाय केवल एक अर्रेइस्ट वर्ग बनाता है इसलिए जब हम एक स्थिर प्रकार की विधि या सामान्य के लिए कुछ भी परिभाषित करते हैं, तो यह सामान्य के सभी उदाहरणों से साझा किया जाता है, मेरे उदाहरण में यह दोनों ArrayList<Integer> और ArrayList<String> द्वारा साझा किया जाता है। यही कारण है कि आपको त्रुटि मिलती है। क्लास के जेनेरिक टाइप पैरामीटर को स्थैतिक संदर्भ में अनुमति नहीं है!

@ बीडी पर रिवेन्हिल: चूंकि इस पुराने प्रश्न ने पिछले साल नए सिरे से ध्यान आकर्षित किया है, चलिए बस चर्चा के लिए थोड़ा सा चलें। आपके doIt पद्धति का शरीर कुछ भी T विशिष्ट नहीं करता है यह रहा:

 public class Clazz<T> { static <T> void doIt(T object) { System.out.println("shake that booty '" + object.getClass().toString() + "' !!!"); } // ... } 

तो आप पूरी तरह से सभी प्रकार के चर ड्रॉप कर सकते हैं और सिर्फ कोड

 public class Clazz { static void doIt(Object object) { System.out.println("shake that booty '" + object.getClass().toString() + "' !!!"); } // ... } 

ठीक। लेकिन हम मूल समस्या के करीब वापस आ जाते हैं। क्लास घोषणापत्र पर प्रथम प्रकार वैरिएबल बेमानी है। इस विधि पर केवल एक दूसरे की ज़रूरत है यहां हम फिर से जाते हैं, लेकिन यह अंतिम उत्तर नहीं है, फिर भी:

 public class Clazz { static <T extends Saying> void doIt(T object) { System.out.println("shake that booty "+ object.say()); } public static void main(String args[]) { Clazz.doIt(new KC()); Clazz.doIt(new SunshineBand()); } } // Output: // KC // Sunshine interface Saying { public String say(); } class KC implements Saying { public String say() { return "KC"; } } class SunshineBand implements Saying { public String say() { return "Sunshine"; } } 

हालांकि, यह सब कुछ बहुत कुछ के बारे में उपद्रव है, क्योंकि निम्न संस्करण केवल उसी तरह काम करता है। सभी की जरूरत है विधि पैरामीटर पर इंटरफ़ेस प्रकार है। कहीं भी दृष्टि में कोई प्रकार चर नहीं क्या वास्तव में मूल समस्या थी?

 public class Clazz { static void doIt(Saying object) { System.out.println("shake that booty "+ object.say()); } public static void main(String args[]) { Clazz.doIt(new KC()); Clazz.doIt(new SunshineBand()); } } interface Saying { public String say(); } class KC implements Saying { public String say() { return "KC"; } } class SunshineBand implements Saying { public String say() { return "Sunshine"; } }