我正在尝试编写一个具有不可为null的API的Java库,并且我希望Kotlin正确地推断出这种不可为null的属性。我正在使用JSR-305批注及其@TypeQualifierDefault
来实现整个软件包的效果,按照Kotlin's Java interop reference。
我全部使用Gradle 4.10.2进行了构建,并向Kotlin编译器as instructed提供了-Xjsr305=strict
。但是,当我反思地检查Kotlin的类型时,它们被报告为platform types,例如:
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())
}
build.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']
}