var someNullField: String? = ""
我将在进程中收到java.lang.String,其注释中包含@ org.jetbrains.annotations.Nullable.
但是List< String?>例如,将返回java.util.List< java.lang.String>没有任何注释不在主元素中,不在类型参数中导致未知的可空性状态
我尝试使用javax.lang.model.util.Types来查找某种结果,但没有.
我现在使用的一些代码:
val utils = processingEnvironment.typeUtils val type = fieldElement.asType() if (type is DeclaredType) { val typeElement = utils.asElement(type) type.typeArguments .forEach { //Trying different ways and just printing for possible results val capture = utils.capture(it) val erasure = utils.erasure(it) val element = utils.asElement(it) printMessage("element: $element isNullable: ${element.isNullable()} isNotNull: ${element.isNotNull()}\ncapture: $capture isNullable: ${capture.isNullable()} isNotNull: ${capture.isNotNull()}\nerasure: $erasure isNullable: ${erasure.isNullable()} isNotNull: ${erasure.isNotNull()}") } }
所有帮助将不胜感激.
解决方法
类型注释可以定位任何类型:局部变量的类型,数组组件类型,类型变量类型甚至返回类型(后面的注释类似地放置,但不同于方法上的旧式注释!).类型注释是通过新的@Target值创建的:ElementType#TYPE_USE.
当科特林人写的时候
List<String?>
这真的意味着
List<@Nullable String>
可以读作:“可空字符串元素列表”.
由于类型本身是目标,因此您需要通过检查它的原始TypeMirror来获取注释(不要打扰已删除或捕获的TypeMirrors,它们与源代码没有足够的连接来保留注释).巧合的是,Mirror API被重构,产生了新的接口AnnotatedConstruct,并且方便地使TypeMirror成为它的后代.
现在是坏消息:到Java 8发布时,对检查类型注释的支持显然不是生产就绪的,所以它被屠杀了. JSR已被重写为暗示,“TypeMirror#getAnnotationMirrors”应该不返回任何内容.
从公共API中删除的支持位仍可通过Oracle特定于供应商的Tree API获得(仅在javac中受支持). Tree#getTypeMirror返回的TypeMirror可能包含您期望它的注释.但由于它是错误的,你只能通过一系列黑客获得注释,并且最终,这将无法一直工作(例如在嵌套类型参数的情况下).有关该方向的一些研究,请参见this question.
The fix在Java 9中合并了这个混乱.我还没有测试它,但看起来TypeMirror#getAnnotationMirrors可能最终工作.没有计划将修复程序反向移植到旧的Java版本.