ほげにっき

hogedigoの日記

genericsキャスト警告

eclipsegenericsを使用してコーディングしていて、generics非対応の外部ライブラリを使用していると、キャスト警告がたくさん出てウザ!となることがある。ライブラリの返したgenercis非対応コレクションを自分のコードのgenerics対応コレクション型変数に代入する際とか。


以下、commons-collectionのメソッド(生Collectionを返す)を使用した例。

Collection<String> a = new ArrayList<String>();
Collection<String> b = new ArrayList<String>();
Collection<String> list = CollectionUtils.union(a, b);

「The expression of type Collection needs unchecked conversion to conform to Collection」てな警告が。。


ある意味仕方のない警告なのだが、こういうのをほっとくと溜まっていって、もっと注意しなければならない警告が埋もれていってしまう。
そこでいろいろ解決策を調べてみた。


まず、eclipseの設定で。※当方英語版ganymede使用あしからず

workspaceまたはproject settingより、[Java]-[Compiler]-[Errors/Warnings]を開き、Generics typesの"Unchecked generic type operation"をIgnoreに変更する。
これでwaningが出なくなった。でも、自社コード中の同警告は出したいなぁ。外部ライブラリ使用箇所のみ警告無視にするなんて無理だよねぇ。


次の方法。おそらく一番使われている方法。アノテーション、@SuppressWarning("unchecked")を使用する。

@SuppressWarnings("unchecked")
private void hoge() {
	Collection<String> a = new ArrayList<String>();
	Collection<String> b = new ArrayList<String>();
	Collection<String> tmp = CollectionUtils.union(a, b);
}

これはeclipseの自動修正機能の選択肢にあるので、何も考えずに適用している人も多い。これでwarningでなくなる。が、メソッドに対してアノテーションつけられてしまうので、他の部分での警告も隠蔽されてしまう。これはイケない。


次。SuppressWarningsを使う箇所をメソッド分割で局所化してみる。とはいってもその都度メソッド作るのは冗長すぎるので、汎用的なものを作ってみた。

public class CastUtils {

	@SuppressWarnings("unchecked")
	public static <T, S extends T> S cast(T o) {
		return (S)o;
	}
}

こんなのをつくって、

Collection<String> a = new ArrayList<String>();
Collection<String> b = new ArrayList<String>();
Collection<String> tmp = cast(CollectionUtils.union(a, b));

こんな感じで。castメソッドはstatic import使用してシンプルに。
結構良くなった・・・気がするだけで、濫用されたら警告を無視するのと大して変わらんかな。。


結局eclipseの設定で警告出さない様にするのが現時点でベストかしら。