我怎样才能重写一个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?) { ... } }