Java 7 では、ジェネリック型の varargs を使用するとこれが発生すると理解しています。
しかし、私の質問は..
Eclipse が「使用するとヒープが汚染される可能性がある」と言っているのは、正確には何を意味しますか?
そして
新しい@SafeVarargs
注釈はこれをどのように防ぐのでしょうか?
ベストアンサー1
ヒープ汚染は専門用語です。これは、参照先のオブジェクトのスーパータイプではない型を持つ参照を指します。
List<A> listOfAs = new ArrayList<>();
List<B> listOfBs = (List<B>)(Object)listOfAs; // points to a list of As
これにより、「説明できない」ClassCastException
問題が発生する可能性があります。
// if the heap never gets polluted, this should never throw a CCE
B b = listOfBs.get(0);
@SafeVarargs
はこれをまったく防ぎません。ただし、ヒープを汚染しないことが証明できるメソッドがありますが、コンパイラはそれを証明できません。以前は、このような API の呼び出し元は、まったく意味のない迷惑な警告を受け取りましたが、呼び出しサイトごとに抑制する必要がありました。現在、API 作成者は宣言サイトで 1 回だけそれを抑制できます。
ただし、その方法が実際には安全でない場合、ユーザーには警告が表示されなくなります。