2012-06-25 24 views
16

Chúng tôi sử dụng một số hàm varargs và khi chúng tôi chuyển sang java 1.7, chúng tôi nhận được một cảnh báo không được kiểm soát lạ.Chức năng Java 1,7 varargs được báo cáo là cảnh báo không được chọn

Chức năng thêm trong giao diện ICache

public interface ICache<O> { 
    void add(Object source, O... objects); 
} 

trong một giao diện báo cáo lỗi.

ICache.java:18: warning: [unchecked] Possible heap pollution from parameterized vararg type O 
    void add(Object source, O... objects); 
    where O is a type-variable: 
    O extends Object declared in interface ICache 
1 warning 

O mở rộng Object, làm lớp bộ nhớ cache chung.

Tôi đọc cảnh báo xlint và chúng tôi biên dịch không được chọn, nhưng http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings dường như ngụ ý rằng lỗi này phải là loại [varargs] không phải là loại không được kiểm soát.

Tôi có thiếu gì đó không?

+0

Chúng tôi có thể xem tất cả các phần liên quan của ICache và SomeClass không? –

+0

Đã chỉnh sửa để thêm nguồn. –

+1

Hãy xem [trang web chính thức của Oracle] (http://docs.oracle.com/javase/7/docs/technotes/guides/language/non-reifiable-varargs.html), nó giải thích ô nhiễm đống ô nhiễm chi tiết , tại sao trình biên dịch Java 7 lại tăng cảnh báo và làm thế nào bạn có thể ngăn chặn nó. – buc

Trả lời

2

Ô nhiễm đống là một thuật ngữ dùng để chỉ một kiểu trỏ đến một đối tượng không phải là siêu kiểu khi sử dụng các vararg với kiểu chung. Nó xảy ra khi một biến của một kiểu tham số tham chiếu đến một đối tượng không thuộc loại tham số đó. This bài đăng trên tràn ngăn xếp giải thích cho bạn chính xác ý nghĩa của việc này và những gì bạn nên làm về nó và cung cấp chi tiết về chú thích @SafeVarargs. Vì vậy, trong giao diện ICache, loại vectơ O trỏ đến Object trong giao diện của bạn, nhưng O không phải là siêu kiểu của Object và điều này tạo ra cảnh báo ô nhiễm đống. Chú ý cách nó nói có thể ô nhiễm đống. Nếu mã của bạn không gây ra bất kỳ sự cố nào như dẫn đến ClassCastException, nó có thể sẽ an toàn và không gây ô nhiễm, nhưng trình biên dịch không có cách nào chứng minh điều này và không thể xác minh tính chính xác của hoạt động, vì vậy nó sẽ vẫn tạo cảnh báo. Đó thực sự là định nghĩa của một cảnh báo không được kiểm soát: khi tính chính xác của một thao tác liên quan đến một kiểu tham số không thể được xác minh. Xem trang this Oracle trên các loại không thể xác minh lại để biết thêm thông tin. Nếu bạn không muốn nhận cảnh báo này, bạn có thể ngăn chặn cảnh báo này bằng SafeVarargs hoặc đơn giản là ngăn chặn nó bằng cách thêm @SuppressWarnings ({"unchecked", "varargs"}) vào khai báo phương pháp, nhưng bạn sẽ không nhận được cảnh báo trong trường hợp phương thức này thực sự không an toàn.

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