メソッドジェネリクス構文と型推論によるキャストの限界
Hoge hoge = new Hoge();
hoge.hoge()
知らなかった....。使えるなコレ。でも、汚いなぁ。
戻り値型に依存した型推論を利用するCastUtilsを使ってたんだけど、mavenでコンパイルしたときだけ
Test.java:8: 型パラメータ
E を判別できません; 型変数 E (上限 E,java.lang.Object) の固有の最大インスタンスが存在しません。
E obj = method1();
と同じエラーが出て困ってたんですよね。JDKを1.6.0_6にあげても同じでした。
Eclipseの場合は問題なくコンパイルできるのに。クラスのコンパイル順序とかに影響するのかしら。
というわけで、そういった場合は上の記法で直接型を指定してあげるようにすればOKだということがわかりました。
そこまでしてCastUtils使ってうれしいか?というと、まあ、@SuppressWarnings("unchecked") というおまじないでコードが汚染されない分だけうれしいんじゃないか、ということで。今のところ。
ちなみにCastUtilsクラスは誰が書いても同じになりそうな↓という感じです。
public class CastUtils { @SuppressWarnings("unchecked") public static <T> T cast(Object object) { return (T) object; } }
まとめ
Hoge hoge = CastUtils.cast(foo);
とか書いてよろこんでたら、mavenがコンパイルエラーをはくので、そんなときは汚いけど
Hoge hoge = CastUtils.<Hoge>cast(foo);
とかいてスルーしましょう、というお話。
追記
普通のキャストだと↓のようにコンパイルエラーになるけど、
for (String hoge : ((List<String>) list)) { // コンパイルエラー }
CastUtils使うと、↓のようにかけるからやっぱり便利ですね。
for (String hoge : CastUtils.<List<String>>cast(list)) { // .... }