Java 嵌套类类型参数的注释方法有什么不同?

Java 嵌套类类型参数的注释方法有什么不同?,java,notnull,Java,Notnull,嵌套类类型参数的注释方法有什么不同 推荐哪一个?这些只是语法上的不同。从语义上讲,它们都意味着“这个参数不应该为空”,实际上,这三个参数都编译成相同的空检查 这三种方法之所以都有效,是因为NotNull具有TYPE\u USE的ElementType,因此您可以使用NotNull注释任何“TYPE USE”。嗯,Foo.Bar中的Bar是类型Bar的用法,因此您可以通过执行Foo.@NotNull Bar来对其进行注释 这就提出了一个问题,为什么NotNull首先有ElementType.TYP

嵌套类类型参数的注释方法有什么不同


推荐哪一个?

这些只是语法上的不同。从语义上讲,它们都意味着“这个参数不应该为空”,实际上,这三个参数都编译成相同的空检查

这三种方法之所以都有效,是因为
NotNull
具有
TYPE\u USE
ElementType
,因此您可以使用
NotNull
注释任何“TYPE USE”。嗯,
Foo.Bar
中的
Bar
是类型
Bar
的用法,因此您可以通过执行
Foo.@NotNull Bar
来对其进行注释

这就提出了一个问题,为什么
NotNull
首先有
ElementType.TYPE\u使用
。这当然不是让你有三种方式来表达完全相同的事情。更可能的原因是允许您这样做:

org.jetbrains.annotations.NotNull

public static void func(Foo.Bar.@NotNull Baz arg0) {

}


public static void func(@NotNull Foo.Bar.Baz arg0) {

}


public static void func(@NotNull Foo.Bar.@NotNull Baz arg0) {

}


汇编至:

package io.github.sweeper777;
import org.jetbrains.annotations.NotNull;
public class Main {
    public static void main(String[] args) {
    }
    public void f(@NotNull Foo.Bar x) {
    }
}
class Foo {
    static class Bar {
    }
}
从“Main.java”编译而来
公共类io.github.Sweewer777.Main{
public io.github.sweeper777.Main();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:返回
公共void f(io.github.sweeper777.Foo$Bar);
代码:
0:aload_1
1:ifnonnull 8
4:iconst_0
5:invokestatic#36//方法$$$reportNull$$$$0:(I)V
8:返回
私有静态void$$$reportNull$$$$0(int);
代码:
0:ldc#38//用于%s.%s的@NotNull参数\'%s\'的字符串参数不能为null
2:iconst_3
3:anewarray#2//类java/lang/Object
6:dup
7:iconst_0
8:ldc#39//字符串x
10:aastore
11:dup
12:iconst_1
13:ldc#40//String io/github/sweeper777/Main
15:aastore
16:dup
17:iconst_2
18:ldc#41//字符串f
20:aastore
21:invokestatic#47//方法java/lang/String.format:(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
24:new#49//class java/lang/IllegalArgumentException
27:dup_x1
28:互换
29:invokespecial#52//方法java/lang/IllegalArgumentException.“:(Ljava/lang/String;)V
32:athrow
}

这是否可以编译?对我来说,这看起来像一道考试题(因为只有一道看起来是可编译的),是这样吗?@Thomas确实可以编译。
@NotNull
具有
类型的
元素类型
,因此可以这样使用它。
package io.github.sweeper777;
import org.jetbrains.annotations.NotNull;
public class Main {
    public static void main(String[] args) {
    }
    public void f( Foo.@NotNull Bar x) {
    }
}
class Foo {
    static class Bar {
    }
}
package io.github.sweeper777;
import org.jetbrains.annotations.NotNull;
public class Main {
    public static void main(String[] args) {
    }
    public void f(@NotNull Foo.@NotNull Bar x) {
    }
}
class Foo {
    static class Bar {
    }
}
package io.github.sweeper777;
import org.jetbrains.annotations.NotNull;
public class Main {
    public static void main(String[] args) {
    }
    public void f(@NotNull Foo.Bar x) {
    }
}
class Foo {
    static class Bar {
    }
}
Compiled from "Main.java"
public class io.github.sweeper777.Main {
  public io.github.sweeper777.Main();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: return

  public void f(io.github.sweeper777.Foo$Bar);
    Code:
       0: aload_1
       1: ifnonnull     8
       4: iconst_0
       5: invokestatic  #36                 // Method $$$reportNull$$$0:(I)V
       8: return

  private static void $$$reportNull$$$0(int);
    Code:
       0: ldc           #38                 // String Argument for @NotNull parameter \'%s\' of %s.%s must not be null
       2: iconst_3
       3: anewarray     #2                  // class java/lang/Object
       6: dup
       7: iconst_0
       8: ldc           #39                 // String x
      10: aastore
      11: dup
      12: iconst_1
      13: ldc           #40                 // String io/github/sweeper777/Main
      15: aastore
      16: dup
      17: iconst_2
      18: ldc           #41                 // String f
      20: aastore
      21: invokestatic  #47                 // Method java/lang/String.format:(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
      24: new           #49                 // class java/lang/IllegalArgumentException
      27: dup_x1
      28: swap
      29: invokespecial #52                 // Method java/lang/IllegalArgumentException."<init>":(Ljava/lang/String;)V
      32: athrow
}