2012-01-31 49 views
6

Xin chào tất cả,Tại sao chúng ta phải sử dụng biến trung gian cho @SuppressWarnings ("bỏ chọn")?

tôi đã tự hỏi lý do là những gì mà

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

là hợp lệ nhưng

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

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

là một lỗi cú pháp/biên dịch?

Lý do chúng tôi phải sử dụng biến số trung gian cho @SuppressWarnings("unchecked") là gì?

+0

mmm..đây tên ở đây nhưng nếu bạn di chuyển SuppressWarning đến trước khối lớp, nó là tốt mặc dù .. 1 cho điều này. – Jasonw

+0

@Jasonw, từ http://docs.oracle.com/javase/7/docs/api/java/lang/SuppressWarnings.html: _ "Là một vấn đề về phong cách, các lập trình viên nên luôn sử dụng chú thích này trên lồng nhau sâu nhất Nếu bạn muốn chặn cảnh báo trong một phương thức cụ thể, bạn nên chú thích phương thức đó thay vì lớp của nó. "_ –

Trả lời

5

@SuppressWarnings("unchecked") được áp dụng trên phạm vi tuyên bố và chuyển nhượng ngay sau đó. Nó có thể được gán cho phạm vi chức năng, hoặc gán một biến cụ thể.
Trong ví dụ đầu tiên của bạn, nó được áp dụng trên biến cục bộ. Trong ví dụ thứ 2, bạn đang cố gắng áp dụng nó trên một nhiệm vụ của một trường đã được khai báo.

Xem rằng điều này cũng không biên dịch:

public class Test<T> { 

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

và điều này không ảnh hưởng đến cảnh báo:

public class Test<T> { 

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

Nói tóm lại, SuppressWarnings không thể được áp dụng trên một biến khắp phạm vi của nó. Nó được áp dụng trên một phép gán + decleration (cho các biến) hoặc trên toàn bộ phạm vi của phương thức khi được áp dụng trên một phương thức.

1

Biên dịch OK cho tôi (đơn giản hóa để loại bỏ mã không liên quan):

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

Các quan sát chỉ chú ý là các @SuppressWarnings đi vào phương pháp chứ không phải dòng mã trong b() do sự ức chế là trên một phân lĩnh vực hơn biến địa phương phân

+0

đã xóa một nhận xét trước đó, được viết trước khi chỉnh sửa của bạn :) +1 cho một tốt đẹp giải thích – posdef

+0

@Bohemian nhưng đối với trường hợp của tôi có các câu lệnh khác trong phương thức 'b' và tôi muốn giữ cho SuppressWarnings càng bị xáo trộn càng tốt. – Pacerier

5

Bởi vì bạn chỉ có thể chú thích:

  • lớp
  • phương pháp
  • biến
  • thông số
  • gói

Bạn không thể chú thích biểu hoặc báo cáo.

+0

Và đôi khi chỉ là một tập hợp con của những chú thích nếu chú thích '@Target (ElementType [])' được sử dụng. – wchargin

Các vấn đề liên quan