Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types Kotlin可以在类文件中发出JSR-305注释吗_Types_Kotlin_Nullable - Fatal编程技术网

Types Kotlin可以在类文件中发出JSR-305注释吗

Types Kotlin可以在类文件中发出JSR-305注释吗,types,kotlin,nullable,Types,Kotlin,Nullable,我使用Kotlin with为API中使用的类生成类型脚本定义 为了保留可空性信息,typescript生成器可以使用字段和方法上的注释。它支持生成脚本中列出的任意注释类名 出于某种原因,Kotlin使用@org.jetbrains.annotations.nullable而不是JSR-305注释@javax.annotation.nullable对可空字段进行注释 JSR-305注释具有RetentionPolicy.RUNTIME,而Jetbrains注释具有RetentionPolicy.

我使用Kotlin with为API中使用的类生成类型脚本定义

为了保留可空性信息,typescript生成器可以使用字段和方法上的注释。它支持生成脚本中列出的任意注释类名

出于某种原因,Kotlin使用
@org.jetbrains.annotations.nullable
而不是JSR-305注释
@javax.annotation.nullable
对可空字段进行注释

JSR-305注释具有
RetentionPolicy.RUNTIME
,而Jetbrains注释具有
RetentionPolicy.CLASS
,因此不适合使用Java反射检测注释的库进行内省

有可能让Kotlin生成基于标准的注释而不是JetBrains专有的注释吗


如果不是,我对处理这个问题的简单解决方案感兴趣。也许是一个Gradle插件,可以从JetBrains或类似的插件生成JSR-305注释。我真的希望不必使用
@Nullable

双重注释所有内容,Kotlin设计用于发出自己的(JetBrains)注释。之所以选择此选项,是因为它从未发布过,JetBrains也没有合法的方式将JSR305注释与编译器捆绑在一起,因为(休眠)JSR305上的许可证不允许这样做。
com.google.code.findbugs:jsr305
maven工件的法律地位同样模糊,因为
javax
包名称空间是专门为jsr保留的

有以下几种可能的解决方案:

  • 编写一个自定义Gradle插件,对Kotlin编译的类文件进行后期处理,并将
    org.jetbrains.annotations.*
    注释更改为相应的
    javax.annotation.*
    注释(
    NotNull
    Nonnull
    Nullable
    Nullable
    )并将相应的属性从运行时不可见批注更改为运行时可见批注

  • 修补程序
    typescript生成器
    ,以便它除了使用Java反射之外,还使用Kotlin反射API从Kotlin类获取空性信息。该任务的入口点是Java
    Class
    实例的扩展,它允许检索所有Kotlin元数据

  • 添加到
    类型脚本生成器
    。此模块使用Kotlin的反射来获取所有Kotlin特定的信息并将其提供给Jackson,而
    typescript generator
    使用Jackson bean内省来获取其类型信息,因此它可能会正常工作


  • 谢谢你的建议。我认为唯一合理的方法是#3,但不幸的是,它需要修补typescript生成器才能使用该模块获取元数据,就像这样。Kotlin团队非常注重java互操作性,但是,如果不编写Kotlin特定的代码,就无法确定可空性,这似乎是他们的一个重大疏忽。java设计人员的一个重大疏忽(十亿美元的疏忽!)就是在java中没有获取可空性信息的标准方法,所以唯一的办法就是通过Kotlin的特定手段。