什么';It’java.util的含义是什么。@可为空?
我正在阅读我在某些代码中找到注释什么';It’java.util的含义是什么。@可为空?,java,Java,我正在阅读我在某些代码中找到注释java.util.@Nullable。我知道@Nullable的意思,但我不懂这个。特别是,我在包java.util中找不到名为Nullable的类。 请告诉我这个java.util.@Nullable: publicstaticjava.util.@Nullable可选toJavaUtil( @可空可选(谷歌可选){ return googleOptional==null?null:googleOptional.toJavaUtil(); } 使用注释时,这是
java.util.@Nullable
。我知道@Nullable
的意思,但我不懂这个。特别是,我在包java.util
中找不到名为Nullable
的类。
请告诉我这个java.util.@Nullable
:
publicstaticjava.util.@Nullable可选toJavaUtil(
@可空可选(谷歌可选){
return googleOptional==null?null:googleOptional.toJavaUtil();
}
使用注释时,这是您希望为类型编写完全限定名而不是添加导入语句时使用的语法
引述:
正确的Java语法在完全限定的
类型名称是将注释放在简单名称部分上,如中所示
util.@可为空的列表。但是,通常最好添加导入
将java.util.List添加到源文件中,以便只需编写
@可为空的列表
JSR308规范的第2页也提到了这一点,可下载。它说:
类型注释出现在类型的简单名称之前,如中所示
@非空字符串或java.lang.@NonNull字符串
行
public static java.util.@Nullable Optional toJavaUtil
是这样写的,因为通常的样式public static@Nullable java.util.Optional toJavaUtil
无效。这在以下文件中定义:
如果类型T的注释适用于类型上下文中的类型(或类型的任何部分),并且T适用于类型上下文,并且注释不允许,则这是编译时错误。
例如,假设一个注释类型TA是用@Target(ElementType.type\u USE)
进行元注释的。术语@TA java.lang.Object
和java@TA lang.Object
是非法的,因为@TA最接近的简单名称被归类为包名。另一方面,java.lang.@TA Object
是合法的
org.checkerframework.checker.nullness的类型声明。qual@Nullable
是:
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
所以它适用于这个规则
这个结构不会破坏执行,因为包java.util
和类名Optional
被拆分,当我们使用javap-c[compiled class name]
查看编译后的代码时可以看到:
class just.a.test.Main {
just.a.test.Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static <T> java.util.Optional<T> toJavaUtil(blub.Optional<T>);
Code:
0: aload_0
1: ifnonnull 8
4: aconst_null
5: goto 12
8: aload_0
9: invokevirtual #2 // Method blub/Optional.toJavaUtil:()Ljava/util/Optional;
12: areturn
}
但当注释额外获得目标类型ElementType.FIELD
,如同一JLS子句中所述,则可以接受:
如果TA附加了@Target(ElementType.FIELD)
,则术语@TA java.lang.Object
在声明和类型上下文的位置是合法的,例如字段声明@TA java.lang.Object f代码>。这里,@TA被认为适用于f的声明(而不是java.lang.Object类型),因为TA适用于字段声明上下文
这里的奇怪之处在于,应用ElementType.TYPE\u使用目标注释的语法并不熟悉。
如果您查看的文档,您将看到不熟悉的目标:
...
@Target(value={TYPE_USE,TYPE_PARAMETER})
<public @interface Nullable
...
并使用以下方法进行处理:
public java.lang.@InterceptedReturnValue(true) String testMethod(String param) {
return null;
}
public @InterceptedReturnValue(false) String testMethod(int param) {
return null;
}
public static void main(String[] args) throws Exception {
Method m = Main.class.getDeclaredMethod("testMethod", String.class);
if(m.getAnnotatedReturnType().isAnnotationPresent(InterceptedReturnValue.class)) {
InterceptedReturnValue config = m.getAnnotatedReturnType()
.getAnnotation(InterceptedReturnValue.class);
if(config.value()) {
//logging return value enabled
}
}
}
我相信很多有用的框架,比如checkerframework,都会最恰当地使用ElementType.TYPE\u使用@PaulRooney我不这么认为。他们谈论的Nullable
似乎在javax.annotation
中,而不是java.util
。我想知道这是否只是一种奇怪的java语法。特别是,这基本上是不是意味着public static@Nullable java.util.Optional to javautil
,但java就是不允许你这样写?@JosephSiblepublic static@Nullable java.util.Optional to javautil
确实是不可能的,但是当导入已经存在时,没有理由使用FQN的Optional
。@Tom在那里的作用域中还有另一个Optional
。谢谢大家,我在Checker框架中找到了这个@Nullable java.util.List在完全限定类型名上编写注释的正确java语法是将注释放在简单名称部分,如java.util中所示。@Nullable List。但是,通常最好将import java.util.List添加到源文件中,这样您就可以编写@Nullable List了。
public static <T> @Nullable Optional<T> toJavaUtil
public static <T> java.util.@Nullable Optional<T> toJavaUtil
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@interface InterceptedReturnValue {
boolean value() default true;
}
public java.lang.@InterceptedReturnValue(true) String testMethod(String param) {
return null;
}
public @InterceptedReturnValue(false) String testMethod(int param) {
return null;
}
public static void main(String[] args) throws Exception {
Method m = Main.class.getDeclaredMethod("testMethod", String.class);
if(m.getAnnotatedReturnType().isAnnotationPresent(InterceptedReturnValue.class)) {
InterceptedReturnValue config = m.getAnnotatedReturnType()
.getAnnotation(InterceptedReturnValue.class);
if(config.value()) {
//logging return value enabled
}
}
}