Android 3.5.1
私はWebViewのを使用していたと私はメソッドの一部をオーバーライドする場合、すべてのパラメータがNULL可能タイプであることに気づきました。
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());
}
私はオーバーライドされたメソッドからNULL値を許容するかどうかを削除するか、それらを保つか思考を残していますので、?
この問題の原因は、から来ているJavaとKotlinの間の相互運用性。間にいくつかの基本的な言語のレベル差があるJava
とKotlin
相互運用性の問題が発生するが。Androidのメーカーはいくつかの提供Lint
など、それらを警告するチェックをUnknown Nullness
。(参照)
詳細を見てとることによってUnknown nullness
からリントチェックをandroid.com、我々はそれを参照してください。
コードを参照し向上させるために
Kotlin
、どちらかとここに明示的にnullであるかどうかの情報を追加することを検討@NonNull
か@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!
.
and on 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
、その引数がNULLかどうかのアノテーションで注釈されていないという方法を、IDEはNULL記号(追加?
で引数の)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)
}
}
一言で言えば、我々はない(SHOULD NOT)削除?
オーバーライドされたメソッドを定義した関数の引数からサインJava
クラス。