加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – kotlin注释处理器中的可空类型

发布时间:2020-12-15 00:39:37 所属栏目:Java 来源:网络整理
导读:我正在为Kotlin开发注释处理器,因为处理过的元素是用 Java编写的,所以我没有收到nullables?相反,使用@Nullable注释,这很好,但我遇到了在类型和高阶函数中接收空参数的问题,对于普通参数. var someNullField: String? = "" 我将在进程中收到java.lang.String
我正在为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版本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读