java - 我是否应该删除继承类中未使用可空值注释的覆盖方法的可空性
问题描述
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
. (参考)
通过查看来自android.comUnknown nullness
的Lint 检查的详细信息,我们看到:
要改进来自 的引用代码,请考虑使用或
Kotlin
在这里添加显式空值信息。@NonNull
@Nullable
如果您使用
Kotlin
引用在类中定义的未注释名称成员Java
(例如aString
),编译器不知道String
映射到 aString
还是 aString?
inKotlin
。这种歧义通过平台类型,来表示String!
。
中的任何引用都
Java
可能是null,这使得Kotlin
严格的 null 安全性要求对于来自 的对象不切实际Java
。声明的类型在平台类型Java
中被特殊处理Kotlin
并称为平台类型。
因此,当我们覆盖Java
其参数未使用空值注释进行注释的方法时,IDE 会为类?
中的参数添加可空符号 ( ) Kotlin
。通过为参数之一传递值来避免在调用方法时抛出异常。 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
推荐阅读
- spring - 如何在论坛项目中实现类似的功能 [spring-boot]
- python - 将控制过滤器添加到 Plotly 条形图
- matlab-figure - 序数变量 corrplot 的替代方法
- python - 我需要一些帮助来使用 Spyder 设置带有 Celeb_a 数据集的 Keras-Tuner
- java - 将 ASCII 数值转换为字符
- coinbase-api - Coinbase Pro API 传输端点上缺少货币字段
- python - 如何使用python获取anki卡的渲染html
- google-cloud-functions - 通过 Auth0 Hook 调用 Google Cloud Function。如何将钩子来源的 IP 列入白名单?
- python - 使用 PyO3 将列表列表作为参数从 Python 传递给 Rust
- c# - EF Core:如何最好地聚合相关的实体属性