Java for Kotlin的包范围非空注释(由Gradle构建)

时间:2018-11-04 12:57:22

标签: java gradle kotlin kotlin-null-safety jsr305

我正在尝试编写一个具有不可为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']
    }
    

0 个答案:

没有答案