無検査

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)

何でもアリなのでした。