首页 > 解决方案 > 我是否应该删除继承类中未使用可空值注释的覆盖方法的可空性

问题描述

Android 3.5.1

我正在使用 WebView,我注意到当我覆盖某些方法时,所有参数都是可为空的类型:

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

这意味着我必须使用safe call操作员才能使用它们。但是,当我查看WebViewClient已覆盖方法的类时,它们并未指定为nullableJava 代码中的注释。

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    return shouldOverrideUrlLoading(view, request.getUrl().toString());
}

所以我想我是从被覆盖的方法中删除可空性还是保留它们?

标签: javaandroidkotlinnullable

解决方案


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


在此处输入图像描述

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

要改进来自 的引用代码,请考虑使用或Kotlin在这里添加显式空值信息。@NonNull@Nullable


developer.android.com上:

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


kotlinlang.org上:

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


因此,当我们覆盖Java其参数未使用空值注释进行注释的方法时,IDE 会为类?中的参数添加可空符号 ( ) Kotlin。通过为参数之一传递值来避免在调用方法时抛出异常。 NullPointerExceptionJavanull

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)
    }
}


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


推荐阅读