gpt4 book ai didi

java - Types isAssignable 和 isSubtype 误解

转载 作者:搜寻专家 更新时间:2023-10-30 21:28:33 24 4
gpt4 key购买 nike

在使用 Java 6 API 编写注释处理器时,我遇到了以特定方式处理所有 map 的需求,但我显然误解了 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'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

这对我来说非常有意义,除了第一个 block ,我希望 HashMap 元素可分配给 Map,并且我希望 HashMap 是 Map 的子类型。

我在这里错过了什么?

最佳答案

我怀疑是因为类型变量。 HashMap<String, String>可分配给 Map<String, String>但是如果没有类型变量的具体实例化,你就不能确定一个任意的 HashMap<A,B>可分配给 Map<X,Y> .

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

DeclaredType wildcardMap = typeUtils.getDeclaredType(
elementUtils.getTypeElement("java.util.Map"),
typeUtils.getWildcardType(null, null),
typeUtils.getWildcardType(null, null));

这将为您提供 Map<?,?> 的类型镜像, 这都是 HashMap实例化可分配给。

关于java - Types isAssignable 和 isSubtype 误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12749517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com