2016-12-06 132 views
0

我想在Java8中實現泛型函數,它驗證集合沒有空成員並返回帶有@NonNull註解的類型。具有@NonNull與集合的返回類型的Java泛型

輸入類型:T擴展Collection,其中T + U可爲空。
結果類型:@NonNull T,與@NonNullü

對於數組這應該是這樣的:

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

不幸的是在Java中沒有辦法改變一個泛型類型的泛型類型參數,就像T extends Collection<U>U。你的陣列方法是等效的將是採取和返回集合實例,像這樣的方法:

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);