eclipseで総称型の警告を無視する方法
eclipseでJavaのコードを書いていると、特に他人のコードやライブラリを使ってるとたまにあらわれる警告。
型の安全性: メソッド add(Object) は raw 型 List に属しています。総称型 List
への参照はパラメーター化される必要があります
例えば、
hoge.getValueList().add(someValue);
なんてコードを書くと出てきたりします。
原因は、hoge.getValueList()
の戻り値がList
型などのraw型の総称型になっていること。
raw型というのは、総称型として定義されている型(例えば、List
やMap
)に対して型引数を指定しなかった時の型。
総称型が導入されて以降は、List<String>
などと使うべきなのに、List
と型引数を指定しないで使うとこんな警告が出るわけです。
キャストで回避する方法は存在しないようで、
((List<String>) hoge.getValueList()).add(someValue);
などとしてみても、
型の安全性: List から List
への未検査キャスト
と言われてしまいます。
結局、警告を消すには「無視する」しかないようで、SuppressWarnings
アノテーションを使います。
値をunchecked
として、このアノテーションを指定すると、その指定された範囲では総称型に関するキャストが警告として現れません。(無視されるのはそういうキャストだけかな? 調べてないが…。)
ところが、アノテーションは文にはつけられないので、
@SuppressWarnings("unchecked") hoge.getValueList().add(someValue);
などという書き方はできません。
仕方がないので、メソッドやクラスにつけることになりますが、無駄に広範囲で無視するようにしてしまうと必要な警告まで見えなくなってしまいます。バグまで見過ごしかねないという、よくある(?)問題です。
そこで、SuppressWarnings
アノテーションがローカル変数宣言にもつけられることを利用します。
@SuppressWarnings("unchecked") List<String> list = hoge.getValueList(); list.add(someValue);
とすることで、警告回避の影響をここだけにとどめることができるので、個人的にお薦めです。
P.S.
どうしてアノテーションが文につけられないかを考えると、構文解析が難解になるからでしょうか。
文のアノテーションを許すと、例えば、
@interface Test { String value() default ""; } … @Test("hoge") length(); //【A】 @Test("hoge").length(); //【B】
と書けることになりますね。
【A】は、length();
に対して@Test("hoge")
がついています。【B】は、("hoge").length();
に対して@Test
がついていることになります。
“)
”の次の“.
”まで読んで初めて("hoge")
がアノテーションの一部なのか、文の一部なのかわかるというのは少々複雑ですね。
というわけで、アノテーションは、次に“(
”が現れうる場所にはつけられないのでしょう。
そうすることで、@何々
のあとに“(
”が現れたとき、その“(
”から対応する“)
”までをアノテーションの一部だと決めて構わなくなりますから。
と、考えると納得がいくのですがいかがでしょう?
どっかに開発者のコメントとかありそうですけど。