वर्ग Foo
(जो स्पष्टता के लिए नहीं एक सामान्य वर्ग है) के लिए निम्नलिखित निर्माता पर विचार करें:एक सामान्य निर्माता के लिए उपयोग केस क्या है?
public <T> Foo(T obj) { }
यह निर्माताओं के लिए मान्य सिंटैक्स है, बस सामान्य generic methods साथ की तरह।
लेकिन इस वाक्यविन्यास का उपयोग क्या है? आम तौर पर जेनेरिक तरीके उनके रिटर्न प्रकार के लिए प्रकार की सुरक्षा प्रदान करते हैं, और कंपाइलर द्वारा टाइप अनुमान से लाभ प्राप्त कर सकते हैं। उदाहरण के लिए:
Pair<String, Integer> stringInt = Pair.of("asfd", 1234);
लेकिन एक निर्माता के लिए एक कॉल हमेशा अपने घोषित वर्ग का एक उदाहरण देता है, इसलिए इसकी प्रकार पैरामीटर वापसी प्रकार पर कोई प्रभाव नहीं। निर्माता ऊपर सिर्फ अपनी erasure साथ प्रतिस्थापित किया जा सकता है:
public Foo(Object obj) { }
पाठ्यक्रम जेनरिक का न केवल वापसी प्रकार के लिए प्रकार सुरक्षा के बारे में कर रहे हैं। निर्माता सिर्फ तर्क (रों) के प्रकार विवश करने के लिए पारित किया जा रहा चाहते हो सकता है हालांकि, ऊपर के तर्क अभी भी एक घिरे प्रकार पैरामीटर के लिए लागू होता है:।
public <N extends Number> Foo(N number) { }
public Foo(Number number) { } //same thing
सीमा के साथ भी नेस्टेड प्रकार पैरामीटर वाइल्डकार्ड का उपयोग नियंत्रित किया जाता है:
public <N extends Number, L extends List<N>> Foo(L numList) { }
public Foo(List<? extends Number> numList) { } //same thing
तो सामान्य निर्माता होने के लिए वैध उपयोग केस क्या है?
आह, बहुत रोचक! +1 –
+1, यह एक अच्छा उदाहरण है, हालांकि यह थोड़ा सा धोखा देता है क्योंकि ओपी विशेष रूप से कहता है कि संलग्न प्रकार सामान्य नहीं है। (' 'सामान्य होगा।) –
@ जॉन फ़ेमिनेला - मेरा मतलब केवल मेरा विशिष्ट उदाहरण' फू 'सामान्य नहीं था, केवल भ्रम से बचने के लिए। मेरा मतलब यह जवाब पर प्रतिबंध के रूप में नहीं था। –