Stringの厳密なサブクラスとして '@NonNull String'が表示されます。結局のところ、null以外のStringは間違いなく 'instanceof' '@ Nullable String'ですが、 '@Nullable String'のインスタンスは '@NonNull String'のインスタンスではないかもしれません(がたとえば、null)。
このように見ると、@ Nullableと@NonNullは型情報なので、インターフェイスでは完全に合理的です。実装者は、nullを返す可能性があり、入力nullについて心配する必要がないことを示しています。また、nullを渡す必要がないことを呼び出し側に示しています。
もちろん、これはすべて非常に合理的ですが、vanilla javac v1.6では、実際のタイプに対して型の安全性を強制する方法はありません。しかし、誰かが夢を見ることができる、またはpmdやfindbugsのようなものを使って、これらの注釈を検証する仕事をすることができます。
@NonNullアノテーションと@Nullableアノテーションは完全な無効型システムでは不十分です。私はJSR305がこれに対処しない理由を本当に知りませんが、3番目のタイプがあります: "@MaybeNull"。ジェネリックスのパラメータの中に表示されます。それ以外の場所では、@ Nullableと同じ意味を持ちます。
public static void addIfNotNull(リスト< @MaybeNull T>リスト、@Nullable Tアイテム){ if(item!= null)list.add(item); }
最初の 'T'の注釈に「@Nullable」がある場合は、非nullリストを渡すことができず、むしろ無駄なAPIになります。一方、@ NonNullの場合、nullableリストを渡すことはできませんでした。実際には、そこに移動しても問題はありません。(A)NullPointerExceptionを引き起こすことはありません。(B)never注釈に違反します。だから、あなたは表現する方法が必要です:この特定の 'T'がNullableかどうかは気にしません。私はそれを読んだときにヌルチェックし、ヌルを書くことは決してないので、問題ではありません。
@MaybeNullと@Nullableの違いは、 '?ジェネリックスでNumberとNumberを拡張します。ジェネリックの外では同じことを意味しますが、ジェネリックでは違いがあります。
だから、すぐに堅固な型検査の希望を保ち続けないでください。
@Inheritedはクラスに対してのみ機能しますが、注釈付きの戻り値の型と注釈付きのパラメータでは似たようなものがあります。
あなたが表現しようとしている意味以外のnullableメソッドの別の解釈は何でしょうか(戻り値はnullでもかまいません)? – Thilo