なんぞこれ><
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
まとめ
わからない><