Estoy leyendo el código de Guava donde encontré la anotación java.util.@Nullable
en algún código. Sé el significado de @Nullable
, pero no entiendo este. En particular, no puedo encontrar una clase llamada Nullable
en el paquete java.util
. Por favor, que alguien me diga cuál es el significado de esto java.util.@Nullable
:
public static <T> java.util.@Nullable Optional<T> toJavaUtil(
@Nullable Optional<T> googleOptional) {
return googleOptional == null ? null : googleOptional.toJavaUtil();
}
Nullable
que está hablando no parece estar enjavax.annotation
, nojava.util
.public static <T> @Nullable java.util.Optional<T> toJavaUtil
, pero que Java simplemente no te permite escribirlo de esa manera?public static <T> @Nullable java.util.Optional<T> toJavaUtil
no es posible, pero no hay ninguna razón para usar el FQNOptional
cuando ya existe la importación.Optional
en el alcance allí.@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.
Respuestas:
La línea
public static <T> java.util.@Nullable Optional<T> toJavaUtil
se escribe así, porque el estilo habitualpublic static <T> @Nullable java.util.Optional<T> toJavaUtil
no es válido. Esto se define en el JLS §9.7.4 :La declaración de tipo de
org.checkerframework.checker.nullness.qual@Nullable
es:Entonces se aplica a esta regla.
Se puede ver que esta estructura no interrumpe la ejecución, ya que el
java.util
nombre del paquete y la claseOptional
se dividieron, se puede ver cuando miramos el código compilado usandojavap -c [compiled class name]
:(
blub.Optional
es una clase local donde copié el código de Guava para obtener un ejemplo mínimo para descompilar / compilar)Como puede ver, la anotación ya no existe. Es solo un marcador para el compilador para evitar una advertencia cuando el método devuelve nulo (y una pista para los lectores de código fuente), pero no se incluirá en el código compilado.
Este error del compilador también se aplica a variables como:
Pero puede ser aceptable cuando la anotación adicionalmente obtiene el tipo de destino
ElementType.FIELD
, como está escrito en la misma cláusula JLS:fuente
Al usar anotaciones, esta es la sintaxis que se usa cuando desea escribir un nombre completo para el tipo, en lugar de agregar una declaración de importación.
Citando del manual del marco del verificador :
También se menciona en la página 2 de la especificación JSR308 que se puede descargar aquí . Dice:
fuente
Lo extraño aquí realmente es la sintaxis desconocida para aplicar una
ElementType.TYPE_USE
anotación dirigida. Si revisas los documentos de Nullable , verás el objetivo desconocido:Esta anotación se usa justo antes del nombre simple del tipo anotado, como en los dos siguientes:
No sabía cuál era el uso de este tipo de objetivo, así que después de una lectura rápida, llegué a este ejemplo simple, que recoge los metadatos del tipo de retorno utilizando una anotación que tiene ese objetivo:
Y lo procesó usando:
Estoy seguro de que muchos marcos útiles, como el checkerframework, hacen el uso más apropiado de
ElementType.TYPE_USE
fuente