2015-09-01 1 views
2

Pour la signature suivante:À quoi renvoie une annotation @Nullable dans le cas d'un paramètre varargs?

public static String format(final String pattern, final @Nullable Object... arguments) 

Où l'annotation @Nullable référence? Pour le tableau ou pour ses éléments? Est-il possible d'annoter les deux options (tableau/éléments)?

Y at-il des différences entre Java 7 et Java 8 (annotations de type)?

+1

Les annotations de type ont été ajoutées dans Java 8 dans le cadre de JSR 308. – Tunaki

Répondre

8

Puisqu'il n'y a toujours pas d'annotation standard @Nullable, vous utilisez une annotation d'une bibliothèque tierce, cela dépend donc de la façon dont elle est déclarée. Les annotations antérieures à Java 8 ne sont pas des annotations de type car cette fonctionnalité n'existe pas dans les anciennes versions. Par conséquent, avec ces annotations, vous annotez toujours le paramètre plutôt que son type. Ceci est généralement interprété par les frameworks comme "le paramètre peut être null" qui serait la référence du tableau, bien que les frameworks puissent traiter les varargs spécialement, mais il n'y a pas de standard imposant un comportement particulier.

Lorsque vous utilisez une réelle annotation de type Java 8, à savoir une annotation avec @Target(ElementType.TYPE_USE), le résultat au mieux expliqué en utilisant la déclaration de tableau ordinaire:

@Nullable ElementType [] 

déclare un tableau de @Nullable ElementType, lisez des éléments nullables alors que

ElementType @Nullable [] 

déclare un type de tableau pouvant être validé.

ainsi, la déclaration

public static String format(final String pattern, final @Nullable Object... arguments) 

implique que les éléments peuvent être null alors

public static String format(final String pattern, final Object @Nullable... arguments) 

déclare que la référence du tableau peut être null. Bien sûr, vous pouvez les combiner pour déclarer que deux, les éléments ou le tableau lui-même, peut être null

public static String format(String pattern, @Nullable Object @Nullable ... arguments) 

Comme l'a dit, d'utiliser ces options, vous avez besoin d'un type d'annotation qui est vraiment déclarée comme Annotation de type Java 8 Ensuite, pour appliquer la sémantique décrite, vous avez besoin d'une implémentation de framework de vérification mise à jour compatible avec les annotations de type Java 8.

+1

La différence est également documentée ici (à l'aide de la syntaxe du tableau): http://help.eclipse.org/mars/index.jsp?topic= % 2Forg.eclipse.jdt.doc.user% 2Ftasks% 2Ftask-using_null_type_annotations.htm & cp = 1_3_9_1_3 & anchor = compatibilité –