如何覆盖java方法,并更改参数的可为空性?

时间:2016-03-31 20:36:27

标签: java android nullable kotlin

我正在覆盖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)
}

1 个答案:

答案 0 :(得分:5)

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!),参数有platform type,也就是说,它的可空性是未知的。

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

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