2012-06-25 16 views
16

いくつかのvarargs関数を使用し、Java 1.7に移行するときに、奇妙な未確認の警告が表示されます。Java 1.7のvarargs関数が未確認の警告として報告されました

機能は、インターフェイスの命令キャッシュにインタフェースで

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はオブジェクトを汎用キャッシュクラスとして拡張します。

私はxlintの警告を読んでいますが、未チェックのままコンパイルしていますが、http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarningsは、このエラーがチェックされていないタイプではなく、[varargs]タイプでなければならないと思われます。

何か不足していますか?

+0

私はICacheとSomeClassのすべての関連部分を見ることができますか? –

+0

ソースを追加するために編集されました。 –

+1

[このオラクルのオラクルのサイト](http://docs.oracle.com/javase/7/docs/technotes/guides/language/non-reifiable-varargs.html)を参照してください。varargs heap pollutionについて詳しく説明しています。なぜJava 7コンパイラは警告を発生させ、どうやってそれを抑制することができますか? – buc

答えて

2

ヒープ汚染は、ジェネリック型で可変引数を使用したときのスーパータイプではないオブジェクトを指しているタイプを指す用語です。これは、パラメータ化された型の変数が、そのパラメータ化された型ではないオブジェクトを参照する場合に発生します。 Thisのスタックオーバーフローは、これが意味するものとそれについて何をすべきかを正確に説明し、@SafeVarargsアノテーションの詳細を示します。だから、インターフェースICacheに、可変引数タイプOは、あなたのインターフェイスでObjectを指しているが、OObjectのスーパータイプではなく、これは、ヒープ汚染の警告を生成します。それはどのようにヒープ汚染が可能であることに注意してください。コードがClassCastExceptionにつながるなどの問題が発生していない場合は、おそらく安全であり、ヒープを汚染しないでしょうが、コンパイラはこれを証明する方法がなく、操作の正当性を検証できないため、警告。これは、実際には未確認の警告の定義です。パラメータ化された型を含む操作の正しさを検証できないときです。詳細は、this Oracleページの非修飾型に関する説明を参照してください。この警告を表示したくない場合は、SafeVarargsでそれを防ぐか、または単にメソッド宣言に@SuppressWarnings ({"unchecked", "varargs"})を追加することで抑制することができますが、実際にはメソッドが安全でない場合には警告は表示されません。

関連する問題