我怎样才能重写一个java方法,并改变参数的可空性?

我重写了Java库中的一个方法,并且该函数的参数被注释为@NonNull 。 但是,在调用该方法时,参数经常以null值出现。 当我重写Kotlin中的方法时,它迫使我遵守@NonNull注释并将该参数标记为不可空。 当然,Kotlin在运行时抛出一个异常,当参数带有空值时。 有什么方法可以重写Kotlin中的方法,并忽略@NonNull注释?

具体来说,我使用Android的appcompat库。 该方法在AppCompatActivity.java中

 @CallSuper public void onSupportActionModeFinished(@NonNull ActionMode mode) { } 

Kotlin中的覆盖:

 override fun onSupportActionModeFinished(mode: ActionMode) { super.onSupportActionModeFinished(mode) } 

Kotlin编译器似乎没有直接的方法来抑制可空性注释处理。

作为一种解决方法,您可以使用Java中的@Nullable注释创建一个中间派生类:当Kotlin编译器在同一代码元素上同时看到@Nullable@NonNull时,它的行为就好像没有可为空注释一样。 然后把它在Kotlin中分类。 例:

考虑在Java中使用@NonNull参数的类:

 abstract class Base { public abstract void f(@NonNull String str); //... } 

Kotlin理解注释: f(str: String) ,类型非空。

现在在Java中扩展Base ,覆盖该方法,并将@Nullable注释添加到Intermediate参数中:

 abstract class Intermediate extends Base { @Override public abstract void f(@Nullable String str); } 

对于Intermediate ,Kotlin看到f(str: String!) ,参数有平台类型 ,也就是说它的可空性是未知的。

之后,您将能够在Intermediate的Kotlin子类中声明可空参数:

 class Derived(): Intermediate() { override fun f(url: String?) { ... } }