जावा 6 एपीआई का उपयोग करके एक एनोटेशन प्रोसेसर लिखने में, मुझे किसी विशेष फैशन में सभी मैप्स को संभालने की ज़रूरत आई, लेकिन मैं स्पष्ट रूप से गलत समझ रहा हूं कि एपीआई क्या करना है या कैसे आना है यह।प्रकार isssignable है और isSubtype गलतफहमी
import javax.lang.model.element.Element;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import javax.annotation.processing.ProcessingEnvironment;
...
public String doThing(Element el, ProcessingEnvironment processingEnv) {
// Utilities from the ProcessingEnvironment
Types typeUtils = processingEnv.getTypeUtils();
Elements elementUtils = processingEnv.getElementUtils();
// The type of the element I'm handling
TypeMirror elType = el.asType();
// Compare the element's type to Map
TypeMirror mapType = elementUtils.getTypeElement("java.util.Map").asType();
System.out.println(elType + " > " + mapType + " = " + typeUtils.isSubtype(elType, mapType));
System.out.println(mapType + " > " + elType + " = " + typeUtils.isSubtype(mapType, elType));
System.out.println(elType + " > " + mapType + " = " + typeUtils.isAssignable(elType, mapType));
System.out.println(mapType + " > " + elType + " = " + typeUtils.isAssignable(mapType, elType));
// Compare the element's type to HashMap
TypeMirror hashmapType = elementUtils.getTypeElement("java.util.HashMap").asType();
System.out.println(elType + " > " + hashmapType + " = " + typeUtils.isSubtype(elType, hashmapType));
System.out.println(hashmapType + " > " + elType + " = " + typeUtils.isSubtype(hashmapType, elType));
System.out.println(elType + " > " + hashmapType + " = " + typeUtils.isAssignable(elType, hashmapType));
System.out.println(hashmapType + " > " + elType + " = " + typeUtils.isAssignable(hashmapType, elType));
// Compare the element's type to Object
TypeMirror objectType = elementUtils.getTypeElement("java.lang.Object").asType();
System.out.println(elType + " > " + objectType + " = " + typeUtils.isSubtype(elType, objectType));
System.out.println(objectType + " > " + elType + " = " + typeUtils.isSubtype(objectType, elType));
System.out.println(elType + " > " + objectType + " = " + typeUtils.isAssignable(elType, objectType));
System.out.println(objectType + " > " + elType + " = " + typeUtils.isAssignable(objectType, elType));
}
यह देखते हुए कि, यहाँ यह के उत्पादन में बताया गया है::
java.util.HashMap<K,V> > java.util.Map<K,V> = false
java.util.Map<K,V> > java.util.HashMap<K,V> = false
java.util.HashMap<K,V> > java.util.Map<K,V> = false
java.util.Map<K,V> > java.util.HashMap<K,V> = false
java.util.HashMap<K,V> > java.util.HashMap<K,V> = true
java.util.HashMap<K,V> > java.util.HashMap<K,V> = true
java.util.HashMap<K,V> > java.util.HashMap<K,V> = true
java.util.HashMap<K,V> > java.util.HashMap<K,V> = true
java.util.HashMap<K,V> > java.lang.Object = true
java.lang.Object > java.util.HashMap<K,V> = false
java.util.HashMap<K,V> > java.lang.Object = true
java.lang.Object > java.util.HashMap<K,V> = false
यह पहला ब्लॉक के अलावा मेरे लिए एकदम सही समझ में आता है जहां मैं एक उम्मीद थी यहाँ कोड है कि मुझे दुखी करने है हैश मैप तत्व को मानचित्र के लिए असाइन करने योग्य है, और मैं उम्मीद करता हूं कि हैश मैप मानचित्र का उप-प्रकार बन जाएगा।
मुझे यहां क्या याद आ रही है?
तुम्हें पता है आह्वान, मैंने सोचा था कि, और मैं मिलान कि प्रकार के मेल खाते हैं सामान्य पत्र के बाद से सोचा, लेकिन मैं नहीं लगता है। धन्यवाद! – Patrick
यह संपूर्ण दृष्टिकोण और @ पैट्रिक का कार्यान्वयन बहुत जटिल है। बस 'type.isAssignable (type, type.erasure (baseGenerifiedType)) का उपयोग करें' (उदाहरण के लिए जांचें कि 'हैश मैप , ?>' के बजाय कच्चे 'हैश मैप' को टाइप करने योग्य है या नहीं) – user1643723