Je lis le code de Guava où j'ai trouvé l'annotation java.util.@Nullable
dans du code. Je connais le sens de @Nullable
, mais je ne comprends pas celui-ci. En particulier, je ne trouve pas de classe appelée Nullable
dans le package java.util
. S'il vous plaît, quelqu'un me dit quel est le sens de ceci java.util.@Nullable
:
public static <T> java.util.@Nullable Optional<T> toJavaUtil(
@Nullable Optional<T> googleOptional) {
return googleOptional == null ? null : googleOptional.toJavaUtil();
}
Nullable
ils parlent semble y êtrejavax.annotation
, nonjava.util
.public static <T> @Nullable java.util.Optional<T> toJavaUtil
, mais que Java ne vous permet pas de l'écrire de cette façon?public static <T> @Nullable java.util.Optional<T> toJavaUtil
n'est en effet pas possible, mais il n'y a aucune raison d'utiliser le FQNOptional
lorsque l'importation existe déjà.Optional
dans le champ d'application.@Nullable java.util.List The correct Java syntax to write an annotation on a fully-qualified type name is to put the annotation on the simple name part, as in java.util.@Nullable List. But, it’s usually better to add import java.util.List to your source file, so that you can just write @Nullable List.
Réponses:
La ligne
public static <T> java.util.@Nullable Optional<T> toJavaUtil
est écrite comme ceci, car le style habituelpublic static <T> @Nullable java.util.Optional<T> toJavaUtil
n'est pas valide. Ceci est défini dans le JLS §9.7.4 :La déclaration de type de
org.checkerframework.checker.nullness.qual@Nullable
est:Cela s'applique donc à cette règle.
Le fait que cette structure ne casse pas l'exécution, puisque le nom du package
java.util
et de la classeOptional
ont été séparés, peut être vu lorsque nous regardons le code compilé en utilisantjavap -c [compiled class name]
:(
blub.Optional
est une classe locale dans laquelle j'ai copié le code de la goyave, afin d'obtenir un exemple minimal à dé / compiler)Comme vous pouvez le voir, l'annotation n'existe plus. Ce n'est qu'un marqueur pour le compilateur pour empêcher un avertissement lorsque la méthode retourne null (et un indice pour les lecteurs de code source), mais il ne sera pas inclus dans le code compilé.
Cette erreur de compilation s'applique également aux variables telles que:
Mais peut devenir acceptable lorsque l'annotation obtient en outre le type cible
ElementType.FIELD
, comme écrit dans la même clause JLS:la source
Lorsque vous utilisez des annotations, il s'agit de la syntaxe utilisée lorsque vous souhaitez écrire un nom complet pour le type, au lieu d'ajouter une instruction d'importation.
Citant le manuel du framework checker :
Il est également mentionné à la page 2 de la spécification JSR308 qui peut être téléchargée ici . Ça dit:
la source
Le plus étrange ici est vraiment la syntaxe inconnue pour appliquer une
ElementType.TYPE_USE
annotation ciblée. Si vous consultez les documents de Nullable , vous verrez la cible inconnue:Cette annotation est utilisée juste avant le nom simple du type annoté, comme dans les deux cas suivants:
Je ne savais pas à quoi servait ce type de cible, donc après une lecture rapide, je suis arrivé à cet exemple simple, qui récupère les métadonnées de type retour en utilisant une annotation qui a cette cible:
Et je l'ai traité en utilisant:
Je suis sûr que de nombreux cadres utiles, tels que checkerframework, font l’utilisation la plus appropriée de
ElementType.TYPE_USE
la source