2016-12-06 6 views
0

Je veux implémenter une fonction générique dans Java8, qui vérifie qu'une collection n'a aucun membre nul et renvoie un type avec l'annotation @NonNull.Java générique avec le type de retour qui a @NonNull avec les collections

Type d'entrée: T extends Collection, où T + U ne peuvent pas être utilisés.
type de résultat: @NonNull T, avec @NonNull U

Array cela ressemblerait à ceci:

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

Mais pour le cas de collecte, je ne sais pas comment définir le type de résultat est identique au type d'entrée, mais possède les annotations @NonNull pour la collection et le type d'élément.
C'est ce que je veux faire, mais il n'est pas une syntaxe valide:

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

Pouvez-vous aider?

Répondre

0

Ceci est à peu près aussi proche que vous pouvez obtenir:

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

Il n'y a donc aucune chance d'obtenir le @NonNull? – fbenoit

+0

Vous pouvez le faire glisser avant le type de retour et avant le type de paramètre, si cette annotation est configurée pour TYPE_USE. Ça vaut le coup d'essayer. –

+0

Le point ici est, que le paramètre n'a pas @ NonNull pour la collection et pas pour le type de ses éléments. Et au retour, les deux l'auront. Oui, @ NonNull est fait pour TYPE_USE. – fbenoit

0

Malheureusement, il n'y a aucun moyen en Java pour modifier un paramètre de type générique d'un type générique, comme le U dans T extends Collection<U>. L'équivalent de votre méthode de tableau serait une méthode qui prend et retourne les instances de collecte, comme ceci:

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

Il accepte une sous-classe de la collection, mais le type de retour ne peut pas être plus précis que la collecte.

Pour traiter les cas plus spécifiques, je suggère d'avoir un peu plus de méthodes pour les sous-classes communes:

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) 

Ou, aussi longtemps que vous retournez le même objet, vous pouvez toujours manuellement exprimés retour à sa classe réelle:

ArrayList<@NonNull E> list2 = (ArrayList<@NonNull E>) collectionHasNoNullMember(arrayList);