दिलचस्प पोस्ट
आप ggplot2 में पहलुओं पर एक सामान्य लेबल कैसे जोड़ सकते हैं? एसएएसएस का इस्तेमाल करते हुए नेस्टेड कक्षाओं को शामिल करना डेटा। योग्य में एची त्रुटि: "गैर-स्थिर फ़ील्ड, विधि या प्रॉपर्टी के लिए ऑब्जेक्ट संदर्भ आवश्यक है …" पायथन लॉगर को लॉग करने के अलावा सभी संदेशों को stdout में आउटपुट करना साक्षात्कार प्रश्न: कचरा संग्रह के लिए पात्र वस्तुएं सीएसएस के साथ div पृष्ठभूमि में विकर्ण लाइनें खींचें सी # का उपयोग करते हुए मैं .NET में मौजूदा उपयोगकर्ता नाम कैसे प्राप्त करूं? log4j: एक विशेष श्रेणी के विशिष्ट एपेन्डर के लॉग आउट आउटपुट कन्स्ट्रक्टर आरंभीकरण-सूची मूल्यांकन क्रम एचटीएमएल। बिगिनकॉलक्शनइटम सहायताकर्ता का उपयोग कर संग्रह से एक आंशिक दृश्य फ़ायरफ़ॉक्स "चयन" टैग पर "क्लिक" ईवेंट को वेबकिट और आईई से अलग क्यों करता है? जावा पर क्लिक करके बटन पर टैग के href को बदलने के लिए सी में विभिन्न प्रकार के तत्वों के साथ किसी स्ट्रिप के माध्यम से लूप का कोई तरीका है? कैसे यूआईटी 8 एरे को बेस 64 एन्कोडेड स्ट्रिंग में परिवर्तित किया जाए?

रनटाइम पर सामान्य प्रकार कैसे प्राप्त करें?

यह मेरा कोड है: निष्पादक इंपेरमेंट एक्स्टेक्टेक्ट एक्सक्लोरर का विस्तार करता है जो अपने कार्यान्वयनकर्ताओं के एक ही निष्पादन तर्कशास्त्र को निकालने (एक्जिक्यूटमैप एक मामला है), जब निष्पादक Imp के निष्पादन () विधि को बुलाते हैं, तो यह विधि को इसके सुपरटेक्पी में बुलाता है, लेकिन सुपरटेप (एब्जेक्टएक्सक्यूटोर ) को कार्यान्वयनकर्ता के लिए अन्य वर्ग बंधन चाहिए (उदाहरण में, यह उपयोगकर्ता वर्ग है):

import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; abstract class AbstractExecutor<E> { public void execute() throws Exception { ArrayList<E> list = new ArrayList<E>(); // here I want to get the real type of 'E' Class cl = this.getClass().getTypeParameters()[0].getGenericDeclaration().getClass(); Object o = cl.getConstructor(String.class).newInstance("Gate"); list.add((E) o); System.out.println(format(list)); } public abstract String format(ArrayList<E> list); public abstract String getType(); } public class ExectorImp<E> extends AbstractExecutor<User> { @Override public String getType() { return "user"; } @Override public String format(ArrayList<User> list) { StringBuffer sb = new StringBuffer(); for (User u : list) { sb.append(u.toString() + " "); } return sb.toString(); } public static void main(String[] args) throws Exception { new ExectorImp().execute(); } } class User { String name; public User(String name) { this.name = name; } } 

तो, मेरे कोड के साथ क्या समस्या है?

Solutions Collecting From Web of "रनटाइम पर सामान्य प्रकार कैसे प्राप्त करें?"

यहाँ कुछ भ्रम है प्रकार के मिटाए जाने के कारण आप रनटाइम पैरामीटर वाले प्रकार से प्रकार की जानकारी नहीं प्राप्त कर सकते हैं:

 Class<E> cls = E.getClass(); // Error. E e = new E(); // Error. 

हालाँकि, आप पैरामीटरेटित टाइप ParameterizedType#getActualTypeArguments() द्वारा क्लास, फ़ील्ड और विधि घोषणा से संकलित पैरामीटर्स प्रकार की जानकारी प्राप्त कर सकते हैं।

 abstract class AbstractExecutor<E> { public void execute() throws Exception { List<E> list = new ArrayList<E>(); Class<E> cls = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; E e = cls.getConstructor(String.class).newInstance("Gate"); list.add(e); System.out.println(format(list)); } // ... } 

अपडेट : यह सिफारिश की गई है या नहीं, हालांकि यह काम करेगा, यह रनटाइम की समस्याओं के प्रति संवेदनशील है, जब क्लास घोषणा में मामूली बदलाव होते हैं। डेवलपर के रूप में आप इसे सही तरीके से दस्तावेज़ कर सकते हैं। एक पूरी तरह से अलग विकल्प के रूप में, आप बहुरूपता का उपयोग कर सकते हैं।

 abstract class AbstractExecutor<E> { public void execute() throws Exception { List<E> list = new ArrayList<E>(); E e = create("Gate"); list.add(e); System.out.println(format(list)); } public abstract E create(String name); // ... } 

और UserExecutor तदनुसार कार्यान्वित करें।

 class UserExecutor extends AbstractExecutor<User> { @Override public User create(String name) { return new User(name); } // ... } 

मुझे लगता है कि आपको getActualTypeParameters उपयोग करना चाहिए; के रूप में getTypeParameters E स्थान पर अपने वर्तमान instantiation में रखा गया है, लेकिन E खुद के लिए (वर्णन करने के लिए कैसे यह घिसा हुआ है, आदि) का उल्लेख नहीं करता है।

getGenericSuperclass करने के लिए आपको पहले getGenericSuperclass उपयोग करना चाहिए।

अद्यतन : लेकिन उपरोक्त केवल काम करता है यदि वर्तमान ऑब्जेक्ट एक जेनेरिक क्लास से जेनेरिक तर्क के साथ तत्काल व्युत्पन्न होता है, जैसे:

 class StringList extends ArrayList<String> { public Type whatsMyGenericType() { return ((ParameterizedType)getGenericSuperClass()).getActualTypeParameters()[0]; } } 

String.class वापस करनी चाहिए।

मुझे नहीं लगता कि आप रनटाइम पर जेनेरिक प्रकार प्राप्त कर सकते हैं। सामान्य प्रकार एक प्रतिबंध है जो संकलन समय पर लागू होता है। जैसा कि मुझे समय-समय पर याद रहता है, सामान्य रंगों के बिना एक सामान्य संग्रह और एक संग्रह के बीच कोई अंतर नहीं है I

समस्या को ठीक करने के लिए सामान्य दृष्टिकोण कोड को थोड़ा बदलना है। Class<E> पैरामीटर स्वीकार करने वाले बेस क्लास पर कन्स्ट्रक्टर को परिभाषित करें इस पैरामीटर को आंतरिक फ़ील्ड में असाइन करें।

उप-क्लास पर बिना पैरामीटर के कन्स्ट्रक्टर को परिभाषित करता है और वहां से super(User.class) को कॉल करता है।

इस तरह आप उप-क्लासेस के ग्राहकों के लिए बहुत अधिक बोझ के बिना तर्क के वर्ग को जानते होंगे।