我正在覆盖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)
}
答案 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?) { ... }
}