我应该删除继承类中未用nullable注释的重写方法的nullability

ant*_*009 5 java android nullable kotlin

Android 3.5.1
Run Code Online (Sandbox Code Playgroud)

我使用的是WebView,我注意到当我重写某些方法时,所有参数都是可为null的类型:

webview.webViewClient = object : WebViewClient() {
    override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
         return super.shouldOverrideUrlLoading(view, request)
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着我必须使用safe call运算符来使用它们。但是,当我查看WebViewClient从其重写方法的类时,未nullable在Java代码中指定为注释。

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    return shouldOverrideUrlLoading(view, request.getUrl().toString());
}
Run Code Online (Sandbox Code Playgroud)

因此,我想到了要从重写方法中删除可空性还是保留它们?

ami*_*phy 8

此问题的来源来自Java和Kotlin之间的互操作性。两者之间存在一些基本的语言级别差异JavaKotlin这会导致互操作性问题。Android Studio提供了一些Lint检查警告它们,例如Unknown Nullness。(参考


在此处输入图片说明

通过Unknown nullness查看来自android.com的Lint check的详细信息,我们看到:

要从中改进引用代码Kotlin,请考虑在此处使用@NonNull或添加明确的null信息@Nullable


并在developer.android.com上

如果Kotlin用于引用在Java类(例如, a String)中定义的未注释的名称成员,则编译器将不知道String映射到a String还是String?in Kotlin。这种模糊性是通过表示平台类型String!


并在kotlinlang.org上

中的任何引用都Java可能为null,这使得Kotlin来自的对象的严格null安全性要求不切实际Java。类型Java声明在经过特殊处理的Kotlin,并呼吁平台类型


因此,当我们重写一个Java其参数不使用无效注释进行注释的方法时,IDE ?将为Kotlin类中的参数添加可为空的符号()。通过为其中一个参数传递值来避免 NullPointerException在调用方法时抛出Javanull

webview.webViewClient = object : WebViewClient() {
    override fun shouldOverrideUrlLoading(
        view: WebView, // <- potential to throw NPE before executing the function block!
        request: WebResourceRequest // <- as well!
    ): Boolean {
        return super.shouldOverrideUrlLoading(view, request)
    }
}
Run Code Online (Sandbox Code Playgroud)


简而言之,当在类中定义了重写的方法时,我们不应?从函数参数中删除符号Java