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)
通过查看 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 aJava
class (e.g. aString
), the compiler doesn't know whether theString
maps to aString
or aString?
inKotlin
. This ambiguity is represented via a platform type,String!
.
和 kotlinlang.org :
Any reference in
Java
may be null, which makesKotlin
's requirements of strict null-safety impractical for objects coming fromJava
. Types ofJava
declarations are treated specially inKotlin
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/