当从Kotlin调用一个非可空注释的Java函数时,我们得到了以柔性类型返回的值,用感叹号表示,例如String!

Kotlin默默地允许将这些灵活的值分配给普通的非null类型,例如String,它可能在运行时导致NullPointerExceptions。

我更希望获得此类分配的编译器警告或错误。或者,将平台类型等同于可为空的类型(例如String?)。

例如,使用以下Java代码:

import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

public class NullTest {

    private String maybe() {
        if (SystemClock.elapsedRealtimeNanos() % 2 == 0) {
            return null;
        }
        return "ok";
    }

    public String annotatedNothing()            { return maybe(); }
    @Nullable public String annotatedNullable() { return maybe(); }
    @NonNull  public String annotatedNonNull()  { return "ok"; }

}

...以及下面的Kotlin代码,我想在两行中出现错误(请参阅注释):
fun testnulls() {
    val obj = NullTest()

    val nullExact: String  = obj.annotatedNullable() // already gives an error
    val nullMaybe: String? = obj.annotatedNullable()
    val nullInfer          = obj.annotatedNullable()

    val okayExact: String  = obj.annotatedNonNull()
    val okayMaybe: String? = obj.annotatedNonNull()
    val okayInfer          = obj.annotatedNonNull()

    val bareExact: String  = obj.annotatedNothing() // I want a compiler error here
    val bareMaybe: String? = obj.annotatedNothing()
    val bareInfer          = obj.annotatedNothing()

    print("length " + nullExact.length)
    print("length " + nullMaybe.length) // already gives an error
    print("length " + nullInfer.length) // already gives an error

    print("length " + okayExact.length)
    print("length " + okayMaybe.length) // already gives an error
    print("length " + okayInfer.length)

    print("length " + bareExact.length)
    print("length " + bareMaybe.length) // already gives an error
    print("length " + bareInfer.length) // I want a compiler error here
}

关键是,这将迫使我添加null检查或!!,确保至少必须对此进行明确说明。

这可能吗?

2014 JetBrains blog post的注释中,当他们引入平台/灵活类型时,听起来他们计划添加一个选项来警告这些情况,但是我还没有找到任何进一步的信息。

最佳答案

是的,有可能可以从Java方法获取任何赋值的编译器警告和/或错误,并且要有一个很强的假设:如果方法没有@NotNull注释,则为@Nullable

怎么样? :) 您将必须编写自己的Idea Custom Inspection插件

对于那些有足够经验来构建自定义检查插件的人,以下是一些有用的链接(可能我会很感激它):

  • Idea插件开发Quick Start Guide
  • 所有现有Idea的源Kotlin Inspections(可能作为现有null safety checks的示例有用)


  • 如果您是熟悉且经验丰富的Idea插件开发人员,则可能不会花费很多时间。否则,我认为您要获得的结果确实不值得您花时间。

    我喜欢您的想法,但是AFAIK在kotlin开发的早期阶段曾尝试实现尽可能完整的null安全检查,但结果如此,以至于存在太多潜在的不安全分配。

    ps如果您最终将构建该检查插件,请告诉我。我个人试图做到这一点,但就我而言,我将首先必须了解有关Idea插件的更多信息。

    08-05 19:07