2012-01-31 123 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

相關問題