При написании обработчика аннотаций, использующего API Java 6, мне пришла в голову необходимость обрабатывать все Карты определенным образом, но я явно не понимаю, что должен делать API или как его вызывать. Вот код, который делает меня несчастным:
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 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 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 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
Это имеет для меня смысл, кроме первого блока, где я ожидаю, что элемент HashMap будет назначен для Map, и я ожидал бы, что HashMap будет подтипом Map.
Что мне здесь не хватает?