無検査
Java のジェネリクスは「警告が出なければ型安全」ということになっているらしく、なんとも心強い。でも逆に言えば、これって「ひとたび警告が出たら後は何でもアリでっせ」という意味にも取れる。とりあえず、下準備を...
$ cat > Untyped.java public class Untyped { public static <T> T iDontNeedTypes(Object x) { return (T)x; } } ^D $ javac Untyped.java 注: Untyped.java の操作は、未チェックまたは安全ではありません。 注: 詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。 $ rm Untyped.java
ばっちり怒られた。もう怒られたくないのでソースファイルは消しておく。で、これを使って...
$ cat > Main.java import java.util.*; public class Main { public static void main(String[] args) { Vector<Double>[] v = Untyped.iDontNeedTypes(new Vector[1]); v[0] = new Vector<Double>(); v[0].add(123.); v[0].add(456.); v[0].add(789.); System.out.println(v[0].get(1) + 4); Integer i = Untyped.iDontNeedTypes(new Double(1)); System.out.println(i); } } ^D $ javac Main.java
無警告で突破。
$ java Main 460.0 Exception in thread "main" java.lang.ClassCastException: java.lang.Double at Main.main(Main.java:9)
何でもアリなのでした。