मैंने ओरेकल की वेबसाइट पर जावा के प्रकार के क्षरण के बारे में पढ़ा ।
टाइप इरेज़र कब होता है? संकलन के समय या रनटाइम पर? जब कक्षा भरी हुई है? जब क्लास को तत्काल किया जाता है?
बहुत सारी साइटें (ऊपर उल्लिखित आधिकारिक ट्यूटोरियल सहित) कहती हैं कि संकलन समय पर प्रकार का क्षरण होता है। यदि संकलित समय पर प्रकार की जानकारी पूरी तरह से हटा दी जाती है, तो जेडीके एक प्रकार की जानकारी या गलत प्रकार की जानकारी के साथ उपयोग किए जाने वाले तरीके को कैसे अनुकूलता देता है?
निम्न उदाहरण पर विचार करें: कहो वर्ग A
एक विधि है, empty(Box<? extends Number> b)
। हम संकलित करते हैं A.java
और वर्ग फ़ाइल प्राप्त करते हैं A.class
।
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
अब हम एक और वर्ग बनाते हैं B
जो empty
गैर-पैरामीटर किए गए तर्क (कच्चे प्रकार) के साथ विधि को लागू करता है empty(new Box())
:। अगर हम क्लासपाथ में संकलित B.java
करते हैं A.class
, तो जेवैक एक चेतावनी जुटाने के लिए पर्याप्त स्मार्ट है। तो A.class
इसमें कुछ प्रकार की जानकारी संग्रहीत है।
public class B {
public static void invoke() {
// java: unchecked method invocation:
// method empty in class A is applied to given types
// required: Box<? extends java.lang.Number>
// found: Box
// java: unchecked conversion
// required: Box<? extends java.lang.Number>
// found: Box
A.empty(new Box());
}
}
मेरा अनुमान है कि जब वर्ग लोड किया जाता है तो प्रकार का क्षरण होता है, लेकिन यह सिर्फ एक अनुमान है। तो यह कब होता है?