जावा जेनरिक की मेरी स्पष्ट रूप से गलत समझ अब तक थी, कि टाइप एरर सभी प्रकार की जानकारी को हटा देता है जैसे रनटाइम पर कुछ भी नहीं बचा है। हाल ही में मैंने एक कोड खंड पर ठोकर खाई जहां मुझे खुद से पूछना पड़ा: यह हैक कैसे काम करता है? सरलीकृत, यह प्रस्तुत करता है के रूप में:रनटाइम पर जावा में सभी प्रकार की जानकारी मिटाई क्यों नहीं जाती है?
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public abstract class SuperClass<T> {
private final Type type;
protected SuperClass(){
ParameterizedType parameterizedType =
(ParameterizedType) getClass().getGenericSuperclass();
type = parameterizedType.getActualTypeArguments()[0];
}
public void tellMyType(){
System.out.println("Hi, my type parameter is " + type);
}
}
और
public class Example {
public static void main(String[] args) {
SuperClass sc = new SuperClass<Integer>(){};
sc.tellMyType();
}
}
Hi, my type parameter is class java.lang.Integer
में मुख्य कक्षा के परिणाम निष्पादित।
हम यहां क्या देख सकते हैं, टी की प्रकार की जानकारी रनटाइम पर भी उपलब्ध है, जो मेरी प्रारंभिक समझ के विपरीत है।
तो मेरा सवाल है: संकलक इसे क्यों रखता है? क्या यह कुछ आंतरिक जेवीएम व्यवहार के लिए आवश्यक है या क्या इस प्रभाव के लिए कोई उचित स्पष्टीकरण है?
संक्षिप्त टिप्पणी: यदि आपका उप-वर्ग सामान्य रूप से जेनेरिक प्रकार को पास करता है (जैसा कि 'पब्लिक क्लास सुपरलिस्ट में ऐरेलिस्ट ') बढ़ाता है, उदाहरण कोड (बिना किसी अज्ञात कक्षाओं के) के आउटपुट" हाय, मेरा टाइप पैरामीटर टी "होगा –
sfussenegger
तो अगर उन्होंने 'मुख्य' में '{}' को छोड़ दिया था (जो संभवतया कन्स्ट्रक्टर को सार्वजनिक रूप से बदलने की आवश्यकता होगी), तो तथ्य यह है कि टाइप पैरामीटर 'इंटेगर' रनटाइम पर खो गया होगा? – MatrixFrog