varargsパラメータによるヒープ汚染の可能性 質問する

varargsパラメータによるヒープ汚染の可能性 質問する

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 回だけそれを抑制できます。

ただし、その方法が実際には安全でない場合、ユーザーには警告が表示されなくなります。

おすすめ記事