java - 我是否应该删除继承类中未使用可空值注释的覆盖方法的可空性

标签 java android kotlin nullable

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我已经覆盖了方法的类未指定为 nullable Java 代码中的注解。
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    return shouldOverrideUrlLoading(view, request.getUrl().toString());
}

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

最佳答案

此问题的来源来自 Java 和 Kotlin 之间的互操作性 . Java 之间存在一些基本的语言水平差异。和 Kotlin这会导致互操作性问题。 Android Studio 提供了一些 Lint检查以警告他们,例如 Unknown Nullness . (reference)

enter image description here

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

To improve referencing code from Kotlin, consider adding explicit nullness information here with either @NonNull or @Nullable.



developer.android.com :

If you use Kotlin to reference an unannotated name member that is defined in a Java class (e.g. a String), the compiler doesn't know whether the String maps to a String or a String? in Kotlin. This ambiguity is represented via a platform type, String!.



kotlinlang.org :

Any reference in Java may be null, which makes Kotlin's requirements of strict null-safety impractical for objects coming from Java. Types of Java declarations are treated specially in Kotlin and called platform types.



因此,当我们覆盖 Java方法,其参数未使用 nullity 注释进行注释,IDE 为 ? 中的参数添加可空符号 ( Kotlin )类(class)。它导致避免 throw NullPointerException当方法在 Java 中被调用时通过传递 null参数之一的值。
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 中定义时,从函数参数签名类(class)。

关于java - 我是否应该删除继承类中未使用可空值注释的覆盖方法的可空性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58398030/

相关文章:

java - Maven 无法执行 objective-c om.jayway.maven.plugins.android. Generation2

java - 条件运行时程序停止

java - 在相对布局中居中 GridView

java - 使用 NetBeans 通过 java 程序导出图像

java - 自动调用父类(super class)方法

java - 用户名密码字符串比较问题

android - 你如何创建一个只允许水平方向的应用程序?

android - RxJava - 在 "subscribe"lambda 中使用不同类型的变量(多个链运算符的结果)

java - 将Kotlin项目从pom.xml转换为build.gradle

spring-boot - 运行gradle生成的脚本并运行Kotlin Spring-Boot运行时出错