为什么我们必须为@SuppressWarnings使用中间变量("unchecked")?

Pac*_*ier 6 java suppress-warnings

大家下午好,

我想知道是什么原因

public class test<T> {
    T[] backing_array;

    public void a(int initial_capacity) {
        @SuppressWarnings("unchecked")
        T[] backing_array = (T[]) new Object[initial_capacity];
        this.backing_array = backing_array;
    }
}
Run Code Online (Sandbox Code Playgroud)

是有效的但是

public class test<T> {
    T[] backing_array;

    public void b(int initial_capacity) {
        @SuppressWarnings("unchecked")
        this.backing_array = (T[]) new Object[initial_capacity];
    }
}
Run Code Online (Sandbox Code Playgroud)

是语法/编译器错误?

我们必须使用中间变量的原因是什么@SuppressWarnings("unchecked")

Kri*_*izz 5

因为你只能注释:

  • 方法
  • 变量
  • 参数

您无法注释表达式或语句.


Enr*_*ico 5

@SuppressWarnings("unchecked")其之后适用于声明和转让的范围.它可以分配给函数的范围或特定变量的赋值.
在第一个示例中,它应用于局部变量.在第二个示例中,您尝试将其应用于已声明的字段的赋值.

看到这也无法编译:

public class Test<T> {

    public void a(int initial_capacity) {
        T[] backing_array;
        @SuppressWarnings("unchecked")
        backing_array = (T[]) new Object[initial_capacity];
    }
}
Run Code Online (Sandbox Code Playgroud)

这对警告没有影响:

public class Test<T> {

    public void a(int initial_capacity) {
        @SuppressWarnings("unchecked")
        T[] backing_array;
        backing_array = (T[]) new Object[initial_capacity];
    }
}
Run Code Online (Sandbox Code Playgroud)

简而言之,SuppressWarnings不能应用于整个范围内的变量.当应用于方法时,它应用于赋值+ decleration(对于变量)或整个方法的作用域.