java - Java for Kotlin 中的包范围非空注释(由 Gradle 构建)
问题描述
我正在尝试编写一个具有不可为空 API 的 Java 库,我希望 Kotlin 能够正确推断出这种不可为空性。根据Kotlin 的 Java interop reference ,我正在使用JSR-305注释及其@TypeQualifierDefault
来实现整个包的效果。
我使用 Gradle 4.10.2 构建它,并按照说明-Xjsr305=strict
提供给 Kotlin 编译器。然而,当我仔细检查 Kotlin 的类型时,它们被报告为平台类型,例如:
fun sample.Foo.bar(T!): kotlin.collections.(Mutable)List<T!>!
我做错了什么,我没有得到以下输出?
fun sample.Foo.bar(T): kotlin.collections.(Mutable)List<T>
请注意,Spring Framework 5 有一个类似的注解,名为@NonNullApi
.
我正在使用 OpenJDK 11。
PS。我知道我可以用 注释每个方法和参数@Nonnull
,但我追求全局行为并将 Kotlin 转换List<T!>
为List<T>
.
这是MCVE:
src/main/java/sampleAnnotation/NonNullPackage.java
package sampleAnnotation; import javax.annotation.Nonnull; import javax.annotation.meta.TypeQualifierDefault; import java.lang.annotation.*; @Nonnull @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PACKAGE) @TypeQualifierDefault({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE_USE }) public @interface NonNullPackage { }
src/main/java/foo/package-info.java
@NonNullPackage package foo; import sampleAnnotation.NonNullPackage;
src/main/java/foo/Foo.java
package foo; import java.util.List; public interface Foo { <T> List<T> bar(T t); }
src/main/kotlin/sampleKotlin/Main.kt
package sampleKotlin import foo.Foo import kotlin.reflect.full.memberFunctions fun main(args : Array<String>) { println(Foo::class.memberFunctions.first()) }
构建.gradle
plugins { id 'java' id 'org.jetbrains.kotlin.jvm' version '1.3.0' } wrapper { gradleVersion = '4.10.2' } repositories { mavenCentral() } dependencies { compileOnly group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2' compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib' compile group: 'org.jetbrains.kotlin', name: 'kotlin-reflect' } compileKotlin { kotlinOptions.freeCompilerArgs = ['-Xjsr305=strict'] }
解决方案
推荐阅读
- elasticsearch - 为什么我的 grok 过滤器不解析我的 filebeats 消息?我看不到 Kibana (ELK) 中的 logstash 解析字段
- javascript - 不能 .map() 似乎是 Array 的值
- excel - 是否有一段代码可以从 Google 搜索中提取地址
- blazor - 动态呈现 Blazor 组件的推荐方法是什么?
- html - 如何将按钮与特定帖子或页面链接?
- python - 如何将 0 和 1 的数组转换为 Python 中的字符串数组?
- javascript - create-react-app:如何包装调用模块?
- python - 涉及 lambda 给出代码的错误
. 在 0x00000234D43C68B8> - java - 适用于 Android 的 GoogleSignInClient.signOut() 不会注销用户
- java - 如何使用spring security在spring-boot应用程序中集中异常处理?