Java 类型是可分配的,而isSubtype是错误的

Java 类型是可分配的,而isSubtype是错误的,java,annotation-processing,Java,Annotation Processing,在使用Java6API编写注释处理器时,我遇到了以特定方式处理所有映射的需求,但我显然误解了API的用途或如何调用它。下面是让我不高兴的代码: import javax.lang.model.element.element; 导入javax.lang.model.type.TypeMirror; 导入javax.lang.model.util.Elements; 导入javax.lang.model.util.Types; 导入javax.annotation.processing.Proces

在使用Java6API编写注释处理器时,我遇到了以特定方式处理所有映射的需求,但我显然误解了API的用途或如何调用它。下面是让我不高兴的代码:

import javax.lang.model.element.element;
导入javax.lang.model.type.TypeMirror;
导入javax.lang.model.util.Elements;
导入javax.lang.model.util.Types;
导入javax.annotation.processing.ProcessingEnvironment;
...
公共字符串点状(元素el,ProcessingEnvironment ProcessingEnvironment){
//ProcessingEnvironment中的实用程序
typetypeutils=processingEnv.getTypeUtils();
Elements elementUtils=processingEnv.getElementUtils();
//我正在处理的元素的类型
TypeMirror elType=el.asType();
//将元素的类型与映射进行比较
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));
//将元素的类型与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));
//将元素的类型与对象进行比较
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>java.util.Map=false
java.util.Map>java.util.HashMap=false
java.util.HashMap>java.util.Map=false
java.util.Map>java.util.HashMap=false
java.util.HashMap>java.util.HashMap=true
java.util.HashMap>java.util.HashMap=true
java.util.HashMap>java.util.HashMap=true
java.util.HashMap>java.util.HashMap=true
java.util.HashMap>java.lang.Object=true
java.lang.Object>java.util.HashMap=false
java.util.HashMap>java.lang.Object=true
java.lang.Object>java.util.HashMap=false
这对我来说非常有意义,除了第一个块,我希望HashMap元素可以分配给Map,并且我希望HashMap是Map的一个子类型


我在这里遗漏了什么?

我怀疑这是因为类型变量
HashMap
可分配给
Map
,但如果没有类型变量的具体实例化,则无法确保任意
HashMap
可分配给
Map

如果用通配符实例化变量,那么应该得到预期的结果

DeclaredType wildcardMap = typeUtils.getDeclaredType(
    elementUtils.getTypeElement("java.util.Map"),
    typeUtils.getWildcardType(null, null),
    typeUtils.getWildcardType(null, null));
这将为您提供
Map
的类型镜像,所有
HashMap
实例化都可以分配给它。

更新(2016年3月):根据@user1643723的评论,似乎有一个库函数我在2012年没有意识到


基于,我现在使用下面的方法来匹配基本类型,就像我在问题中为Map描述的那样

TypeElement集合=elementUtils.getTypeElement(“java.util.COLLECTION”);
TypeElement-MAP=elementUtils.getTypeElement(“java.util.MAP”);
TypeElement VOID=elementUtils.getTypeElement(“java.lang.VOID”);
WildcardType WILDCARD\u TYPE\u NULL=typeUtils.getWildcardType(NULL,NULL);
Map cachedParentTypes=新HashMap();
...
公共静态布尔isA(类型镜像类型,类型元素类型元素){
//我们以前用过这种型号吗?
DeclaredType parentType=cachedParentTypes.get(typeElement.getQualifiedName().toString());
if(parentType==null){
//此typeElement需要多少泛型类型参数?
int genericsCount=typeElement.getTypeParameters().size();
//使用空值填充正确数量的类型
TypeMirror[]types=新的TypeMirror[genericsCount];
对于(int i=0;i
这是我喜欢的

if(isA(elType,VOID)){
isVoid=true;
}else if(isA(elType,COLLECTION)| | elType.getKind()==TypeKind.ARRAY){
isCollectionOrArray=true;
}else if(isA(elType,MAP)){
isMap=真;
}

你知道,我想,既然泛型字母匹配,类型也会匹配,但我想不会。谢谢整个方法和@Patrick的实现都太复杂了。只需使用
types.isAssignable(type,types.erasure(baseGenerifiedType))
(例如,检查type是否可分配给原始
HashMap
,而不是
HashMap