IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

Java 5 の型推論が分からない

なんぞこれ><

Javaの型推論Utilsクラス - yukobaのブログ
ってことでやってみた

これは OK

import java.util.ArrayList;
import static java.lang.System.out;

public class Main {

    public static <S, T> T cast(S o) { return (T) o; }

    public static void main(String[] args) {
        ArrayList a = new ArrayList();
        ArrayList<String> b = cast(a);
        b.add("hoge");
        b.add("fuga");
        out.println(b);

        Hoge c = cast(a); // キャストできない場合は実行時例外になる
    }
}

class Hoge {}
$ javac -Xlint:unchecked Main.java && java Main
Main.java:7: warning: [unchecked] unchecked cast
found   : S
required: T
    public static <S, T> T cast(S o) { return (T) o; }
                                                  ^
1 warning
[hoge, fuga]
Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList
	at Main.main(Main.java:22)

でもなんでこれはダメ?

import java.util.ArrayList;
import static java.lang.System.out;

public class Main {

    public static <S, T> T cast(S o) { return (T) o; }

    public static void hoge(ArrayList<String> a) {
        a.add("piyo");
    }

    public static void main(String[] args) {
        ArrayList a = new ArrayList();

        hoge(cast(a));

        out.println(a);
    }
}
$ javac -Xlint:unchecked Main.java && java Main
Main.java:6: warning: [unchecked] unchecked cast
found   : S
required: T
    public static <S, T> T cast(S o) { return (T) o; }
                                                  ^
Main.java:15: hoge(java.util.ArrayList<java.lang.String>) in Main cannot be applied to (java.lang.Object)
        hoge(cast(a));
        ^
1 error
1 warning

hoge の引数の型 ArrayList が 型変数 T に与えられて、 a の型 ArrayList が型変数 S に与えられて OK なんじゃないの><?

まとめ

わからない><