メソッドジェネリクス構文と型推論によるキャストの限界

Hoge hoge = new Hoge();
hoge.hoge()

Javaの型推論Utilsクラスのカラクリ

知らなかった....。使えるなコレ。でも、汚いなぁ。


戻り値型に依存した型推論を利用するCastUtilsを使ってたんだけど、mavenでコンパイルしたときだけ

Test.java:8: 型パラメータ E を判別できません; 型変数 E (上限 E,java.lang.Object) の固有の最大インスタンスが存在しません。
E obj = method1();

通勤筋肉痛 - 気付いたとき、気が向いたとき。by ykhr

と同じエラーが出て困ってたんですよね。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)) {
            // ....
        }