2012-01-31 115 views
6

下午好一切,为什么我们必须为@SuppressWarnings(“unchecked”)使用中间变量?

我想知道有什么原因,

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")

+0

mmm ...同样在这里,但如果您将SuppressWarning移至类块之前,尽管如此.. +1。 – Jasonw 2012-01-31 07:58:48

+0

@Jasonw,来自http://docs.oracle.com/javase/7/docs/api/java/lang/SuppressWarnings.html:_“作为一个风格问题,程序员应该总是在最深嵌套中使用这个注解如果你想在特定的方法中抑制警告,你应该注释该方法而不是它的类。“_ – 2015-07-14 22:18:41

回答

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]; 
    } 
} 

,这对警告不影响:

public class Test<T> { 

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

总之,SuppressWarnings不能对一个变量的整个范围应用。它应用于赋值+ decleration(用于变量)或应用于方法时整个方法的范围。

1

我编译OK(简化,以去除不相关的代码):

public static class Test<T> { 
    T[] array; 

    public void a() { 
     @SuppressWarnings("unchecked") 
     T[] a = (T[]) new Object[1]; 
     this.array = a; 
    } 

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

笔记的唯一的观察是@SuppressWarnings那张方法而非b()代码行由于抑制是在分配,而不是局部变量赋值

+0

删除了之前的评论,这是在编辑之前编写的:) +1解释 – posdef 2012-01-31 08:03:45

+0

@Bohemian但是对于我的情况,在方法'b'中还有其他的陈述,我想尽可能保持SuppressWarnings的范围。 – Pacerier 2012-01-31 08:10:10

5

因为你只能注释:

  • 方法
  • 变量
  • 参数

不能标注表达式或语句。

+0

如果使用'@Target(ElementType [])'注释,有时候只有这些子集的一个子集。 – wchargin 2013-06-02 05:24:44

相关问题