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

bra*_*ain 7 java android nullable kotlin

我正在重写Java库中的方法,并将该函数的参数注释为@NonNull.但是,调用该方法时,参数通常会带有一个null值.当我在Kotlin中覆盖该方法时,它会强制我尊重@NonNull注释并将参数标记为不可为空.当然,当参数带有空值时,Kotlin会在运行时抛出异常.有什么方法可以覆盖Kotlin中的方法并忽略@NonNull注释?

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

@CallSuper
public void onSupportActionModeFinished(@NonNull ActionMode mode) {
}
Run Code Online (Sandbox Code Playgroud)

Kotlin中的覆盖:

override fun onSupportActionModeFinished(mode: ActionMode) {
    super.onSupportActionModeFinished(mode)
}
Run Code Online (Sandbox Code Playgroud)

hot*_*key 7

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

作为一种变通方法,可以使中间派生类与@Nullable在Java中注释:当科特林编译器同时看到@Nullable@NonNull相同的代码元素,它的行为就好像没有空性的注释.然后在Kotlin中将其子类化.例:

考虑一个带有@NonNullJava参数的类:

abstract class Base {
    public abstract void f(@NonNull String str);
    //...
}
Run Code Online (Sandbox Code Playgroud)

Kotlin理解注释:f(str: String),类型是非null.

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

abstract class Intermediate extends Base {
    @Override
    public abstract void f(@Nullable String str);
}
Run Code Online (Sandbox Code Playgroud)

因为Intermediate,Kotlin看到f(str: String!),参数具有平台类型,即其可空性未知.

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

class Derived(): Intermediate() {
    override fun f(url: String?) { ... }
}
Run Code Online (Sandbox Code Playgroud)

  • 我只是希望他们添加一种方法来抑制或忽略这种情况下的警告.创建该中间类只是为了修复一个参数是一件痛苦的事. (3认同)