2016-12-06 5 views
0

コレクションにnullメンバーがなく、@ NonNullアノテーションを持つ型を返すことを検証する汎用関数をJava8で実装したいと考えています。コレクションに@NonNullを持つJava汎用コレクション

入力の種類:T extends Collection、T + UはNULL可能です。
結果型:@NonNull Tは、@NonNull U

と配列については、これは次のようになります。

public static <T> @NonNull T @NonNull[] arrayHasNoNullMember(@Nullable T @Nullable[] value) { 

しかし、コレクションケースのために、私はその結果の型を定義する方法がわかりません入力型と同じですが、コレクションと要素タイプの@NonNullアノテーションがあります。
これは私が何をしたいのかであるが、それは有効な構文ではありません。

public static <T extends Collection<U>, U> @NonNull T<@NonNull U> collectionHasNoNullMember(T<U> col) { 

あなたは助けることはできますか?

答えて

0

これはあなたが得ることができると同じくらい近いです:

public static <T extends Collection<@NonNull U>, U> @NonNull T collectionHasNoNullMember(@NonNull T col) { 
+0

したがって、@ NonNullを取得する機会はありません。 – fbenoit

+0

戻り値の型の前で、その注釈がTYPE_USE用に構成されている場合は、パラメータ型の前に挿入することができます。試すだけの価値があります。 –

+0

ここで重要な点は、パラメータにはコレクションの@ NonNullがなく、その要素タイプではないということです。そして帰国の際には両方ともそれを持っているはずです。はい、@ NonNullはTYPE_USEのために作られています。 – fbenoit

0

は残念ながらT extends Collection<U>Uのようなジェネリック型のジェネリック型パラメータを、変更するJavaで方法はありません。お使いのアレイ法の同等はそうのような、コレクションのインスタンスを取得して返すメソッドのようになります。

public static <E> @NonNull Collection<@NonNull E> collectionHasNoNullMember(@Nullable Collection<? extends @Nullable E> col) 

これは、コレクションの任意のサブクラスを受け入れますが、戻り値の型がコレクションより具体的にすることはできません。

public static <E> @NonNull List<@NonNull E> listHasNoNullMember(@Nullable List<? extends @Nullable E> list) 
public static <E> @NonNull Set<@NonNull E> setHasNoNullMember(@Nullable Set<? extends @Nullable E> set) 
public static <E> @NonNull Queue<@NonNull E> queueHasNoNullMember(@Nullable Queue<? extends @Nullable E> queue) 

または、限り、あなたは同じオブジェクトを返しているとして、あなたは常に手動に戻ってそれをキャストすることができます:より具体的なケースを処理するには

、私は一般的なサブクラスのためのいくつかのより多くのメソッドを持つことをお勧め実際のクラス:

ArrayList<@NonNull E> list2 = (ArrayList<@NonNull E>) collectionHasNoNullMember(arrayList); 
関連する問題