Android Studioでコード検査を行っていると、次の警告が表示されます
Probable bugs
@NotNull/@Nullable problems
Not annotated method overrides method annotated with @RecentlyNonNull
次のコード
@Override
public String toString() {
return title;
}
以前、戻り値が null になることはないという意味の @NonNull アノテーションを見たことがありますが、@RecentlyNonNull とは何ですか? いつ使用すればよいですか?
何の説明も提供しません。
lint の推奨事項では、その注釈を追加することが推奨されていますが、それは何をするのでしょうか?
ベストアンサー1
要約
内部的には制約であるため、これを制約@RecentlyNonNull
として考慮し@NonNull
、コード内でも同様に尊重してください。@RecentlyNonNull
@NonNull
つまり、実際の質問では、OP は、スーパークラスで定義された(ビルド時に に変換される)@NonNull
に準拠するために、オーバーライドされたメソッドに をアノテーションする必要があります。@NonNull
@RecentlyNonNull
この@RecentlyNonNull
注釈はSDK javadoc APIの一部ではありません
。support
サブパッケージには存在しないなぜならソース コード内に存在するようには設計されていません。代わりに、ビルド時に計算され、@NonNull
スタブ ソース ファイル内で「最新」とみなされた場合に置き換えられます。
これは内部処理なので、質問に対する単純で直接的な回答はありませんが、この注釈とその起源をよりよく理解するためのヒントをいくつか提供できるかもしれません。
1) @RecentlyNonNull または @RecentlyNullable: スタブ ソース ファイルでのみ生成される注釈。
Android では、生成されたスタブ ファイルと生成されたドキュメント スタブは同じレベルの情報を提供しません。@RecentlyNonNull
または、@RecentlyNullable
スタブ ファイルには表示されることがありますが、スタブ ファイルのみを保持するドキュメント スタブには表示されません。
詳細は以下をご覧ください。Options
クラスのソースコード:
"$ARG_DOC_STUBS "、"API のドキュメント スタブ ソース ファイルを生成します。ドキュメント スタブ " + "ファイルは通常のスタブファイルに似ていますが、いくつかの違いがあります。たとえば、" + 「スタブファイルでは、@NonNull の代わりに @RecentlyNonNull のような特別な注釈を使用します」 + 「要素が最近非nullとしてマークされたことを示しますが、ドキュメントスタブでは「+ 「これを @NonNull としてリストするだけです...」
これgoogleソースドキュメント以下を確認します:
@RecentlyNullable
ここには、やなど、サポート ライブラリにない注釈がいくつかあります@RecentlyNonNull
。これらは、コードが最近 null/非 null で注釈付けされたことを自動的にマークするためにスタブでのみ使用されます。これらの注釈をソース コードに含める必要はありません。最近かどうかはビルド時に計算され、通常の null 注釈の代わりにスタブに挿入されます。
2) コード リンターと IDE の警告/エラー用に導入された注釈。
これによればブログこれらのアノテーションは Kotlin サポートに由来しており、非 null 制約がどれくらい最近のものかに応じて、コンパイラ/リンターが非 null 違反の重大度レベルを適用できるようにします (最近: 警告コンパイル、最近ではない: エラーコンパイル)。
通常、Kotlin で null 可能性の契約違反が発生すると、コンパイル エラーが発生します。ただし、新しく注釈が付けられた API が既存のコードと互換性があることを保証するために、Kotlin コンパイラ チームが提供する内部メカニズムを使用して、API を最近注釈が付けられたものとしてマークします。最近注釈が付けられた API は、Kotlin コンパイラからエラーではなく警告のみになります。Kotlin 1.2.60 以降を使用する必要があります。
私たちの計画では、新しく追加された null 可能性アノテーションは警告のみを生成し、翌年の Android SDK から重大度レベルをエラーに上げる予定です。目標は、コードを更新するための十分な時間を提供することです。