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

标签 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;
    }
}

有效但是

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

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

是语法/编译器错误吗?

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

最佳答案

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

看到这也不能编译:

public class Test<T> {

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

这对警告没有影响:

public class Test<T> {

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

简而言之,SuppressWarnings 不能应用于变量的整个范围。它应用于赋值+减速(对于变量)或应用于方法时应用于整个方法的范围。

关于java - 为什么我们必须为 @SuppressWarnings ("unchecked"使用中间变量)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9076083/

相关文章:

java - 根据从 Fragment A 收集的数据使用较少的样板代码从 Activity 启动 Fragment B

java - 使用 Java 代码终止/停止应用程序

java - 实现线程时,使用不可变对象(immutable对象)比使用可变对象更好吗?

python - numpy "Mean of empty slice."警告

c# - Visual Studio : GlobalSuppressions. cs:前缀 ~P:用于 SuppressMessage 中的属性目标

java - 从 PHP 到哪里去?

java - 在 Java 中写入文本文件时插入新行

eclipse - 如何在 Eclipse 中添加自定义 SuppressWarnings token

shell - 如何抑制 shell 脚本错误消息?

c# - 生成的代码 (xsd.exe) 的 SuppressMessage 编译器警告 CS1591