簡體   English   中英

Java 1.7 varargs函數報告為未經檢查的警告

[英]Java 1.7 varargs function reported as unchecked warning

我們使用了一些varargs函數,當我們轉向java 1.7時,我們得到了一個奇怪的未經檢查的警告。

功能在接口ICache中添加

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

在界面中報告錯誤。

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擴展了Object,作為其通用緩存類。

我閱讀了xlint警告並且我們在未經檢查的情況下編譯,但是http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings似乎暗示這個錯誤應該是[varargs]類型不是未經檢查的類型。

我錯過了什么嗎?

堆污染是一個術語,指的是指向對象的類型,當使用具有泛型類型的varargs時,它不是超類型。 當參數化類型的變量引用不是該參數化類型的對象時,就會發生這種情況。 關於堆棧溢出的這篇文章向您解釋了這意味着什么以及您應該如何處理它,並提供有關@SafeVarargs注釋的詳細信息。 因此,在接口ICache ,vararg類型O指向接口中的Object ,但O不是Object的超類型,這會產生堆污染警告。 注意它是如何說可能的堆污染。 如果您的代碼沒有導致任何問題,例如導致ClassCastException ,它可能是安全的並且不會污染堆,但是編譯器無法證明這一點並且無法驗證操作的正確性,因此它仍然會生成警告。 這實際上是未經檢查的警告的定義:當無法驗證涉及參數化類型的操作的正確性時。 有關更多信息,請參閱不可重復類型的Oracle頁面。 如果您不想收到此警告,可以使用SafeVarargs阻止它,或者通過將@SuppressWarnings ({"unchecked", "varargs"})到方法聲明中來禁止它,但是您不會收到警告該方法確實不安全的事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM