मैं एक वर्ग एक ही प्रकार के दो मानों की एक जोड़ी का प्रतिनिधित्व करने के लिए है (प्रकार है जो हो सकता है प्रकार की एक विशिष्ट सेट के किसी भी):जावा जेनरिक सीमाएं या गलत उपयोग?
public class Pair<E extends AClass>{
private E var1;
private E var2;
}
इस वर्ग एक रूपरेखा द्वारा प्रयोग किया जाता है, इसलिए यह एक नहीं की जरूरत है -argument निर्माता है, जिसमें मेरे पास 2 चर (var1, var2) का दृष्टांत के लिए:
public class Pair<E extends AClass>{
private E var1;
private E var2;
public Pair(){
var1 = invoke constructor of type E;
var2 = invoke constructor of type E
}
}
वहाँ स्पष्ट रूप से यहाँ कई समस्याओं का कर रहे हैं:
में वेरिएबल्स को तुरंत चालू करने के लिए मुझे किसी भी तरह का सटीक प्रकार पता होना चाहिए और उस विशिष्ट प्रकार के कन्स्ट्रक्टर का आह्वान करना चाहिए; सबसे अच्छा मामले में यह, की तरह कुछ निर्माता में एक बहुत बड़ी है, तो किसी और बयान का मतलब:
public Pair(){ if(var1 instanceof SpecificType1){ var1 = new SpecificType1(); var2 = new SpecificType2(); } }
यहां तक कि अगर मैं के रूप में ऊपर करते हैं, मैं कुछ समस्याओं का होगा क्योंकि var1 प्रकार ई और मैं की घोषणा की जाती है SpecficType1 को तुरंत चालू करने और परिणामस्वरूप ऑब्जेक्ट var1/var2 को असाइन करने के लिए प्रयास करते समय एक प्रकार की मिलान त्रुटि प्राप्त होगी। आदेश यह काम करने के लिए, मैं ई को कास्ट करने के लिए है:
var1 = (E)new SpecificType1();
लेकिन इस संकलन समय प्रकार के रूप में मैं एक सामान्य प्रकार के लिए एक विशेष प्रकार कास्ट करने के लिए कोशिश कर रहा हूँ जाँच नष्ट कर देता है।
क्या यह जावा में जेनेरिक की एक सीमा है या क्या यह परिदृश्य जेनेरिक का उपयोग करने के लिए एक बुरा है?
यदि आपको एक सामान्य कंटेनर के अंदर 'instanceOf' का उपयोग करना है, तो आपके पास एक डिज़ाइन समस्या है। –
आप [class.forName()] (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#forName%28java.lang.String%29) आज़मा सकते हैं –
पूछने वाले को अधिसूचना (चूंकि संपादन पूछताछ को सूचित नहीं करते हैं): मैंने एक साधारण कोड नमूना जोड़ा है कि आपके मामले में फैक्टरी डिजाइन पैटर्न का उपयोग कैसे करें – amit