java – kotlin注释处理器中的可空类型
我正在为Kotlin开发注释处理器,因为处理过的元素是用
Java编写的,所以我没有收到nullables?相反,使用@Nullable注释,这很好,但我遇到了在类型和高阶函数中接收空参数的问题,对于普通参数.
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()}") } } 所有帮助将不胜感激. 解决方法
一些必要的历史记录:从Java 6开始(当镜像API公开时),Java注释不能用于任何东西,而是可以通过反射访问的相同类型的顶级元素.您可以注释类,方法和字段,但无法注释类型参数(List< String>)或局部变量(String value = …). Sun / Oracle工程师已经承认这种限制,并且在Java 8中出现了所谓的“类型注释”.
类型注释可以定位任何类型:局部变量的类型,数组组件类型,类型变量类型甚至返回类型(后面的注释类似地放置,但不同于方法上的旧式注释!).类型注释是通过新的@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版本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |