1. ホーム
  2. java

[解決済み] varargs パラメータでヒープを汚染する可能性があります。

2022-03-19 20:18:08

質問

Java 7でgeneric型でvarargsを使用した場合に発生すると理解しています。

しかし、私の質問は...

Eclipseが言う「"その使用はヒープを汚染する可能性があります」とは、具体的にはどういう意味ですか?

そして

新しい @SafeVarargs アノテーションはこれを防ぐのでしょうか?

解決方法は?

ヒープポリューションとは専門用語です。参照するオブジェクトのスーパータイプではない型を持つ参照を指します。

List<A> listOfAs = new ArrayList<>();
List<B> listOfBs = (List<B>)(Object)listOfAs; // points to a list of As

これは、"unexplainable"につながる可能性があります。 ClassCastException s.

// if the heap never gets polluted, this should never throw a CCE
B b = listOfBs.get(0); 

@SafeVarargs はこれを全く防げません。しかし、ヒープを汚染しないことが証明できるメソッドもありますし、コンパイラはそれを証明できないだけです。以前は、そのようなAPIの呼び出し側には、全く無意味な、しかし呼び出しのたびに抑制されなければならない厄介な警告が表示されていました。今は、APIの作者が宣言の場所で一度だけ警告を抑制することができます。

しかし、実際にそのメソッドが ではない 安全であれば、ユーザーへの警告はなくなります。