Genericsとcast

あぁ、書き方が悪っかったですね。cast が入るのはメソッドを呼ぶ側であって、実装側ではないです。
例えばこんなの。

public class Foo {
    public static void main(String[] args) throws Exception {
        Method m1 = Foo.class.getMethod("m1", Object.class);
        System.out.println(m1.getReturnType().getName());
    }

    public static void call() {
        Foo a = new Foo();
        Foo b = m1(a);
        Foo c = m2(a);
    }

    public static <T> T m1(T obj) {
        return obj;
    }

    public static Foo m2(Foo obj) {
        return obj;
    }
}

実行してみれば、m1 の戻り値の型が Object であることが分る。で、DL Java Decompiler だとか、Jad なんかで逆コンパイルすると call の中身はこんなの。

    public static void call()
    {
        Foo foo = new Foo();
        Foo foo1 = (Foo)m1(foo);
        Foo foo2 = m2(foo);
    }

ついでに、javap -c だとこう。

public static void call();
  Code:
   0:   new     #2; //class Foo
   3:   dup
   4:   invokespecial   #11; //Method "<init>":()V
   7:   astore_0
   8:   aload_0
   9:   invokestatic    #12; //Method m1:(Ljava/lang/Object;)Ljava/lang/Object;
   12:  checkcast       #2; //class Foo
   15:  astore_1
   16:  aload_0
   17:  invokestatic    #13; //Method m2:(LFoo;)LFoo;
   20:  astore_2
   21:  return

まぁ、その程度の話です。