दिलचस्प पोस्ट
दृश्य पर एंड्रॉइड स्केल एनीमेशन जावास्क्रिप्ट चेक अगर चर मौजूद है (परिभाषित / आरम्भिक) जावा और SQLite टीएसक्यूएल का उपयोग कर डेटाबेस में सभी तालिकाओं की सूची कैसे प्राप्त करूं? मैप के एनोटेशन के कॉलआउट में कस्टम व्यू जोड़ने के लिए कैसे करें क्या सभी JSON ऑब्जेक्ट्स वैध जावास्क्रिप्ट ऑब्जेक्ट हैं? विंडोज स्टार्टअप पर जावा एप्लीकेशन चलाएं Log4net XML आउटपुट जावास्क्रिप्ट में मैं एक फाइल इन्पुट तत्व के लिए "क्लिक" ईवेंट फ़ायर प्रोग्राम बना सकता हूं? सी में पूर्णांक आकार क्या पर निर्भर करता है? यूआरएल पुन: लिखना: सीएसएस, जेएस, और चित्र नहीं लोड हो रहा है अजीब स्विफ्ट नंबर प्रकार कास्टिंग JavaFX MySQL कनेक्शन उदाहरण कृपया पूर्णांक में हेक्स और हेक्स को पूर्णांक में कनवर्ट करें किसी फाइल को छोडने का तरीका, जबकि यह एफएसटीआईएम के साथ खुला है

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

यह मेरा कोड है: निष्पादक इंपेरमेंट एक्स्टेक्टेक्ट एक्सक्लोरर का विस्तार करता है जो अपने कार्यान्वयनकर्ताओं के एक ही निष्पादन तर्कशास्त्र को निकालने (एक्जिक्यूटमैप एक मामला है), जब निष्पादक 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; } } 

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

वेब के समाधान से एकत्रित समाधान "रनटाइम पर सामान्य प्रकार कैसे प्राप्त करें?"

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

 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) को कॉल करता है।

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